Namespaces
Variants

std:: char_traits

From cppreference.net
Défini dans l'en-tête <string>
template <

class CharT

> class char_traits ;

La classe char_traits est un modèle de classe de traits qui abstrait les opérations de base sur les caractères et les chaînes pour un type de caractère donné. L'ensemble d'opérations défini est tel que les algorithmes génériques peuvent presque toujours être implémentés en fonction de celui-ci. Il est ainsi possible d'utiliser de tels algorithmes avec presque n'importe quel type de caractère ou de chaîne, simplement en fournissant une classe char_traits personnalisée.

Le modèle de classe char_traits sert de base pour les instanciations explicites. L'utilisateur peut fournir une spécialisation pour tout type de caractère personnalisé. Plusieurs spécialisations explicites sont fournies pour les types de caractères standards (voir ci-dessous), les autres spécialisations ne sont pas tenues de satisfaire aux exigences de CharTraits .

Table des matières

Spécialisations

La bibliothèque standard fournit les spécialisations standard suivantes :

Défini dans l'en-tête <string>
std :: char_traits < char > les traits de caractères standards de char
std :: char_traits < wchar_t > les traits de caractères standards de wchar_t
std :: char_traits < char8_t > (C++20) les traits de caractères standards de char8_t
std :: char_traits < char16_t > (C++11) les traits de caractères standards de char16_t
std :: char_traits < char32_t > (C++11) les traits de caractères standards de char32_t

Toutes ces spécialisations satisfont aux exigences de CharTraits .

Types membres

Les spécialisations standards définissent les types membres suivants requis par CharTraits :

CharT Type membre
char_type int_type off_type pos_type state_type
char char int std::streamoff std::streampos std::mbstate_t
wchar_t wchar_t std::wint_t std::wstreampos
char8_t char8_t unsigned int std::u8streampos
char16_t char16_t std::uint_least16_t std::u16streampos
char32_t char32_t std::uint_least32_t std::u32streampos

En plus de cela, les spécialisations standard définissent également le type membre comparison_category comme std::strong_ordering .

(depuis C++20)

Fonctions membres

Les spécialisations standards définissent les fonctions membres statiques suivantes requises par CharTraits :

[static]
assigne un caractère
(fonction membre publique statique)
[static]
compare deux caractères
(fonction membre publique statique)
[static]
déplace une séquence de caractères sur une autre
(fonction membre publique statique)
[static]
copie une séquence de caractères
(fonction membre publique statique)
[static]
compare lexicographiquement deux séquences de caractères
(fonction membre publique statique)
[static]
retourne la longueur d'une séquence de caractères
(fonction membre publique statique)
[static]
trouve un caractère dans une séquence de caractères
(fonction membre publique statique)
convertit int_type en char_type équivalent
(fonction membre publique statique)
[static]
convertit char_type en int_type équivalent
(fonction membre publique statique)
[static]
compare deux valeurs int_type
(fonction membre publique statique)
[static]
retourne une valeur eof
(fonction membre publique statique)
[static]
vérifie si un caractère est une valeur eof
(fonction membre publique statique)

Notes

CharTraits n'exige pas de définir les types et fonctions listés ci-dessus comme membres directs, il exige seulement que des types comme X::type et des expressions comme X :: func ( args ) soient valides et possèdent la sémantique requise. Les traits de caractères définis par l'utilisateur peuvent être dérivés d'autres classes de traits de caractères et ne remplacer que certains de leurs membres, voir l'exemple ci-dessous.

Exemple

Les traits de caractères définis par l'utilisateur peuvent être utilisés pour fournir une comparaison insensible à la casse :

#include <cctype>
#include <iostream>
#include <string>
#include <string_view>
struct ci_char_traits : public std::char_traits<char>
{
    static char to_upper(char ch)
    {
        return std::toupper((unsigned char) ch);
    }
    static bool eq(char c1, char c2)
    {
        return to_upper(c1) == to_upper(c2);
    }
    static bool lt(char c1, char c2)
    {
         return to_upper(c1) < to_upper(c2);
    }
    static int compare(const char* s1, const char* s2, std::size_t n)
    {
        while (n-- != 0)
        {
            if (to_upper(*s1) < to_upper(*s2))
                return -1;
            if (to_upper(*s1) > to_upper(*s2))
                return 1;
            ++s1;
            ++s2;
        }
        return 0;
    }
    static const char* find(const char* s, std::size_t n, char a)
    {
        const auto ua{to_upper(a)};
        while (n-- != 0) 
        {
            if (to_upper(*s) == ua)
                return s;
            s++;
        }
        return nullptr;
    }
};
template<class DstTraits, class CharT, class SrcTraits>
constexpr std::basic_string_view<CharT, DstTraits>
    traits_cast(const std::basic_string_view<CharT, SrcTraits> src) noexcept
{
    return {src.data(), src.size()};
}
int main()
{
    using namespace std::literals;
    constexpr auto s1 = "Hello"sv;
    constexpr auto s2 = "heLLo"sv;
    if (traits_cast<ci_char_traits>(s1) == traits_cast<ci_char_traits>(s2))
        std::cout << s1 << " and " << s2 << " are equal\n";
}

Sortie :

Hello and heLLo are equal

Voir aussi

stocke et manipule des séquences de caractères
(modèle de classe)
vue de chaîne en lecture seule
(modèle de classe)
encapsule un dispositif abstrait donné ( std::basic_streambuf )
et fournit une interface d'entrée de haut niveau
(modèle de classe)
encapsule un dispositif abstrait donné ( std::basic_streambuf )
et fournit une interface de sortie de haut niveau
(modèle de classe)
abstrait un dispositif brut
(modèle de classe)