C++ named requirements: CharTraits
CharTraits es una clase de rasgos que abstrae las operaciones básicas de caracteres y cadenas para un tipo de carácter dado. La mayoría de las clases de cadena y entrada/salida de la biblioteca estándar requieren un CharTraits parámetro de tipo plantilla junto con un parámetro de tipo plantilla de carácter correspondiente.
Contenidos |
Requisitos
Ninguna operación listada a continuación en CharTraits puede lanzar una excepción.
Dado
-
CharT, un tipo de carácter -
X, un tipo CharTraits para el tipoCharT -
c
,
d
, valores de tipo
CharT - p , q , valores de tipo const CharT *
-
s
, un valor de tipo
CharT* - n , i , j , valores de tipo std::size_t
-
e
,
f
, valores de tipo
X::int_type -
pos
, un valor de tipo
X::pos_type -
state
, un valor de tipo
X::state_type -
r
, un lvalue de tipo
CharT
Tipos
| Tipo | Semántica |
|---|---|
X::char_type
|
CharT
|
X::int_type
|
Un tipo que puede contener todos los valores válidos de
X::char_type
más
X
::
eof
(
)
|
X::off_type
|
Invoca comportamiento definido por la implementación si no es
std::streamoff
cuando
X
se utiliza como parámetro de plantilla traits en clases de entrada/salida.
|
X::pos_type
|
|
X::state_type
|
Destructible , CopyAssignable , CopyConstructible , DefaultConstructible |
Expresiones
| Expresión | Tipo de retorno | Semántica | Complejidad |
|---|---|---|---|
| X :: eq ( c, d ) | bool | Retorna: si c debe tratarse como igual a d | Constante |
| X :: lt ( c, d ) | bool | Retorna: si c debe tratarse como menor que d | Constante |
| X :: compare ( p, q, n ) | int |
Retorna:
|
Lineal |
| X :: length ( p ) | std::size_t | Devuelve: el menor i tal que X :: eq ( p [ i ] , CharT ( ) ) sea true | Lineal |
| X :: find ( p, n, c ) | const X :: char_type * |
Retorna:
|
Lineal |
| X :: move ( s, p, n ) |
X::char_type*
|
|
Lineal |
| X :: copy ( s, p, n ) |
X::char_type*
|
|
Lineal |
| X :: assign ( r, d ) | (No utilizado) | Asigna r = d | Constante |
| X :: assign ( s, n, c ) |
X::char_type*
|
|
Lineal |
| X :: not_eof ( e ) |
X::int_type
|
Retorna:
|
Constante |
| X :: to_char_type ( e ) |
X::char_type
|
Retorna:
|
Constante |
| X :: to_int_type ( c ) |
X::int_type
|
Retorna: algún valor
e
, restringido por las definiciones de
X::to_char_type
y
X::eq_int_type
|
Constante |
| X :: eq_int_type ( e, f ) | bool |
|
Constante |
| X :: eof ( ) |
X::int_type
|
Retorna: un valor e tal que X :: eq_int_type ( e, X :: to_int_type ( c ) ) es false para todos los valores c | Constante |
Biblioteca estándar
CharTraits es requerido por las siguientes plantillas de clase de la biblioteca estándar como un parámetro de tipo de plantilla:
Cadenas |
|
|
almacena y manipula secuencias de caracteres
(plantilla de clase) |
|
|
(C++17)
|
vista de cadena de solo lectura
(plantilla de clase) |
Flujos |
|
|
gestiona un búfer de flujo arbitrario
(plantilla de clase) |
|
|
envuelve un dispositivo abstracto dado (
std::basic_streambuf
)
y proporciona una interfaz de entrada de alto nivel (plantilla de clase) |
|
|
implementa operaciones de entrada de flujo de archivos de alto nivel
(plantilla de clase) |
|
|
implementa operaciones de entrada de flujo de cadena de alto nivel
(plantilla de clase) |
|
|
(C++23)
|
implementa operaciones de entrada con búfer de caracteres fijo
(plantilla de clase) |
|
envuelve un dispositivo abstracto dado (
std::basic_streambuf
)
y proporciona una interfaz de salida de alto nivel (plantilla de clase) |
|
|
implementa operaciones de salida de flujo de archivos de alto nivel
(plantilla de clase) |
|
|
implementa operaciones de salida de flujo de cadena de alto nivel
(plantilla de clase) |
|
|
(C++20)
|
envoltura de flujo de salida sincronizado
(plantilla de clase) |
|
(C++23)
|
implementa operaciones de salida de búfer de caracteres fijo
(plantilla de clase) |
|
envuelve un dispositivo abstracto dado (
std::basic_streambuf
)
y proporciona una interfaz de entrada/salida de alto nivel (plantilla de clase) |
|
|
implementa operaciones de entrada/salida de flujo de archivos de alto nivel
(plantilla de clase) |
|
|
implementa operaciones de entrada/salida de flujo de cadena de alto nivel
(plantilla de clase) |
|
|
(C++23)
|
implementa operaciones de entrada/salida con búfer de caracteres fijo
(plantilla de clase) |
Iteradores de flujo |
|
|
iterador de entrada que lee desde
std::basic_istream
(plantilla de clase) |
|
|
iterador de salida que escribe a
std::basic_ostream
(plantilla de clase) |
|
Búferes de flujo |
|
|
abstrae un dispositivo sin procesar
(plantilla de clase) |
|
|
implementa dispositivo de archivo sin formato
(plantilla de clase) |
|
|
implementa dispositivo de cadena sin formato
(plantilla de clase) |
|
|
(C++20)
|
envoltorio de dispositivo de salida sincronizado
(plantilla de clase) |
|
(C++23)
|
implementa un dispositivo de búfer de caracteres fijo sin formato
(plantilla de clase) |
Iteradores de búfer de flujo |
|
|
iterador de entrada que lee desde
std::basic_streambuf
(plantilla de clase) |
|
|
iterador de salida que escribe en
std::basic_streambuf
(plantilla de clase) |
|
CharTraits
es satisfecho por las siguientes especializaciones explícitas de la biblioteca estándar de
std::char_traits
:
|
template
<>
class
char_traits
<
char
>
;
template
<>
class
char_traits
<
wchar_t
>
;
|
(desde C++20) (desde C++11) (desde C++11) |
|
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 335 | C++98 |
los requisitos de la sobrecarga binaria de
assign
no prevenían asignaciones a rvalues
|
su primer argumento
solo puede ser un lvalue |
| LWG 352 | C++98 |
X::state_type
solo se requería que fuera
CopyConstructible |
también se requiere que sea
CopyAssignable y DefaultConstructible |
| LWG 3085 | C++98 |
X
::
copy
(
s, p, n
)
solo requería que
p
no estuviera
en
[
s
,
s
+
n
)
, lo cual es demasiado débil
[1]
|
requiere que
[
p
,
p
+
n
)
y
[
s
,
s
+
n
)
no se solapen
|
-
↑
[p,p + n)y[s,s + n)pueden superponerse. Usar std::memcpy para implementarX::copyresulta en comportamiento indefinido en este caso.