std:: char_traits
|
Definido en el encabezado
<string>
|
||
|
template
<
class
CharT
|
||
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
|
(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) |
|
[static]
|
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) |
|
|
(C++17)
|
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) |