Namespaces
Variants

std:: char_traits

From cppreference.net
Definido en el encabezado <string>
template <

class CharT

> class char_traits ;

La clase char_traits es una plantilla de clase de rasgos que abstrae las operaciones básicas de caracteres y cadenas para un tipo de carácter dado. El conjunto de operaciones definido es tal que los algoritmos genéricos casi siempre pueden implementarse en términos de ella. Por lo tanto, es posible utilizar dichos algoritmos con casi cualquier tipo de carácter o cadena posible, simplemente proporcionando una clase char_traits personalizada.

La plantilla de clase char_traits sirve como base para instanciaciones explícitas. El usuario puede proporcionar una especialización para cualquier tipo de carácter personalizado. Se proporcionan varias especializaciones explícitas para los tipos de carácter estándar (ver más abajo), otras especializaciones no están obligadas a satisfacer los requisitos de CharTraits .

Contenidos

Especializaciones

La biblioteca estándar proporciona las siguientes especializaciones estándar:

Definido en el encabezado <string>
std :: char_traits < char > las características de caracteres estándar de char
std :: char_traits < wchar_t > las características de caracteres estándar de wchar_t
std :: char_traits < char8_t > (C++20) las características de caracteres estándar de char8_t
std :: char_traits < char16_t > (C++11) las características de caracteres estándar de char16_t
std :: char_traits < char32_t > (C++11) las características de caracteres estándar de char32_t

Todas estas especializaciones satisfacen los requisitos de CharTraits .

Tipos de miembros

Las especializaciones estándar definen los siguientes tipos de miembros requeridos por CharTraits :

CharT Tipo de miembro
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

Además de eso, las especializaciones estándar también definen el tipo miembro comparison_category como std::strong_ordering .

(desde C++20)

Funciones miembro

Las especializaciones estándar definen las siguientes funciones miembro estáticas requeridas por CharTraits :

[static]
asigna un carácter
(función miembro pública estática)
[static]
compara dos caracteres
(función miembro pública estática)
[static]
mueve una secuencia de caracteres a otra
(función miembro pública estática)
[static]
copia una secuencia de caracteres
(función miembro pública estática)
[static]
compara lexicográficamente dos secuencias de caracteres
(función miembro pública estática)
[static]
devuelve la longitud de una secuencia de caracteres
(función miembro pública estática)
[static]
encuentra un carácter en una secuencia de caracteres
(función miembro pública estática)
convierte int_type al equivalente char_type
(función miembro pública estática)
[static]
convierte char_type al equivalente int_type
(función miembro pública estática)
[static]
compara dos valores int_type
(función miembro pública estática)
[static]
devuelve un valor eof
(función miembro pública estática)
[static]
verifica si un carácter es valor eof
(función miembro pública estática)

Notas

CharTraits no requiere definir los tipos y funciones listados anteriormente como miembros directos, solo requiere que tipos como X::type y expresiones como X :: func ( args ) sean válidas y tengan la semántica requerida. Los rasgos de caracteres definidos por el usuario pueden derivarse de otras clases de rasgos de caracteres y solo sobrescribir algunos de sus miembros, consulte el ejemplo a continuación.

Ejemplo

Los rasgos de caracteres definidos por el usuario pueden utilizarse para proporcionar comparación sin distinción entre mayúsculas y minúsculas :

#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";
}

Salida:

Hello and heLLo are equal

Véase también

almacena y manipula secuencias de caracteres
(plantilla de clase)
vista de cadena de solo lectura
(plantilla de clase)
envuelve un dispositivo abstracto dado ( std::basic_streambuf )
y proporciona interfaz de entrada de alto nivel
(plantilla de clase)
envuelve un dispositivo abstracto dado ( std::basic_streambuf )
y proporciona interfaz de salida de alto nivel
(plantilla de clase)
abstrae un dispositivo crudo
(plantilla de clase)