std:: char_traits
|
Défini dans l'en-tête
<string>
|
||
|
template
<
class
CharT
|
||
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
|
(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) |
|
[static]
|
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) |
|
|
(C++17)
|
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) |