std:: char_traits
|
Definiert im Header
<string>
|
||
|
template
<
class
CharT
|
||
Die
char_traits
-Klasse ist eine Traits-Klassenvorlage, die grundlegende Zeichen- und Zeichenkettenoperationen für einen gegebenen Zeichentyp abstrahiert. Der definierte Operationensatz ist so gestaltet, dass generische Algorithmen fast immer darauf aufbauend implementiert werden können. Es ist somit möglich, solche Algorithmen mit nahezu jedem beliebigen Zeichen- oder Zeichenkettentyp zu verwenden, indem man einfach eine angepasste
char_traits
-Klasse bereitstellt.
Die
char_traits
-Klassenvorlage dient als Basis für explizite Instanziierungen. Der Benutzer kann
eine Spezialisierung bereitstellen
für beliebige benutzerdefinierte Zeichentypen. Mehrere explizite Spezialisierungen sind für die Standard-Zeichentypen vorhanden (siehe unten), andere Spezialisierungen müssen nicht die Anforderungen von
CharTraits
erfüllen.
Inhaltsverzeichnis |
Spezialisierungen
Die Standardbibliothek bietet die folgenden Standardspezialisierungen:
|
Definiert im Header
<string>
|
|
| std :: char_traits < char > | die Standard-Zeicheneigenschaften von char |
| std :: char_traits < wchar_t > | die Standard-Zeicheneigenschaften von wchar_t |
| std :: char_traits < char8_t > (C++20) | die Standard-Zeicheneigenschaften von char8_t |
| std :: char_traits < char16_t > (C++11) | die Standard-Zeicheneigenschaften von char16_t |
| std :: char_traits < char32_t > (C++11) | die Standard-Zeicheneigenschaften von char32_t |
Alle diese Spezialisierungen erfüllen die Anforderungen von CharTraits .
Mitgliedertypen
Die Standardspezialisierungen definieren die folgenden Membertypen, die von CharTraits benötigt werden:
CharT
|
Mitgliedertyp | ||||
|---|---|---|---|---|---|
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 | ||
|
Darüber hinaus definieren die Standardspezialisierungen auch den Member-Typ
|
(seit C++20) |
Memberfunktionen
Die standardmäßigen Spezialisierungen definieren die folgenden statischen Elementfunktionen, die von CharTraits benötigt werden:
|
[static]
|
weist ein Zeichen zu
(öffentliche statische Elementfunktion) |
|
[static]
|
vergleicht zwei Zeichen
(öffentliche statische Elementfunktion) |
|
[static]
|
verschiebt eine Zeichenfolge auf eine andere
(öffentliche statische Elementfunktion) |
|
[static]
|
kopiert eine Zeichenfolge
(öffentliche statische Elementfunktion) |
|
[static]
|
vergleicht zwei Zeichenfolgen lexikographisch
(öffentliche statische Elementfunktion) |
|
[static]
|
gibt die Länge einer Zeichenfolge zurück
(öffentliche statische Elementfunktion) |
|
[static]
|
findet ein Zeichen in einer Zeichenfolge
(öffentliche statische Elementfunktion) |
|
[static]
|
konvertiert
int_type
zum entsprechenden
char_type
(öffentliche statische Elementfunktion) |
|
[static]
|
konvertiert
char_type
zum entsprechenden
int_type
(öffentliche statische Elementfunktion) |
|
[static]
|
vergleicht zwei
int_type
Werte
(öffentliche statische Elementfunktion) |
|
[static]
|
gibt einen
eof
Wert zurück
(öffentliche statische Elementfunktion) |
|
[static]
|
prüft ob ein Zeichen ein
eof
Wert ist
(öffentliche statische Elementfunktion) |
Hinweise
CharTraits
erfordert nicht, dass die oben aufgeführten Typen und Funktionen als direkte Member definiert werden, es werden lediglich Typen wie
X::type
und Ausdrücke wie
X
::
func
(
args
)
gültig sind und die erforderliche Semantik haben. Benutzerdefinierte Zeicheneigenschaften können von anderen Zeicheneigenschaftenklassen abgeleitet werden und nur einige ihrer Member überschreiben, siehe das folgende Beispiel.
Beispiel
Benutzerdefinierte Zeichenmerkmale können verwendet werden, um einen fallunabhängigen Vergleich bereitzustellen:
#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"; }
Ausgabe:
Hello and heLLo are equal
Siehe auch
|
speichert und manipuliert Zeichenfolgen
(Klassentemplate) |
|
|
(C++17)
|
schreibgeschützte String-Ansicht
(Klassentemplate) |
|
kapselt ein gegebenes abstraktes Gerät (
std::basic_streambuf
)
und bietet eine hochrangige Eingabeschnittstelle (Klassentemplate) |
|
|
kapselt ein gegebenes abstraktes Gerät (
std::basic_streambuf
)
und bietet eine hochrangige Ausgabeschnittstelle (Klassentemplate) |
|
|
abstrahiert ein Rohgerät
(Klassentemplate) |