Namespaces
Variants

std:: char_traits

From cppreference.net
Definiert im Header <string>
template <

class CharT

> class char_traits ;

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 comparison_category als std::strong_ordering .

(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)
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)
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)