¿Qué tipo de “Rasgos” se usan/definen en el Estándar C++ 0x?
c++11 traits (4)
Un rasgo en C ++ encapsula una familia de operaciones que permite que un algoritmo o una estructura de datos operen con ese tipo con el que se crea una instancia. char_traits
son un ejemplo para agrupar string
y funciones requeridas por archivos.
Pero no todos los rasgos tienen "rasgo" en su nombre, ¿verdad? numeric_limits
viene a la mente. ¿Es este un "rasgo", también? Incluso sin el nombre "rasgo" en ella?
Entonces, ¿hay otras Plantillas que podrían / deberían ser consideradas un "Rasgo"? Además de los ejemplos que encontré:
-
allocator_traits
cómo obtener memoria -
pointer_traits
cómo acceder a un objeto indirectamente -
type_traits
meta programación -
char_taits
para secuencia de símbolos -
iterator_traits
cómo avanzar, retroceder y al elemento -
regex_traits
para ... expresiones regulares.
Supongo que lo que estoy preguntando, ¿existe una definición pura para los rasgos?
Algunas cosas de las que estoy especialmente inseguro son:
-
numeric_limits
mencionados anteriormente - "rasgos" de personalización de
<chrono>
, [20.11.4], es decir,duration_values
- que hay de hash? ¿Se puede considerar que el
hash<>
functorhash<>
es un rasgo? - Si ese es el caso, ¿no son todos los requisitos "rasgos", como "CopyAssignable", etc.?
- Y luego, ¿son los "Conceptos" abandonados el "rasgo" máximo -Definición?
Actualización: La pregunta de qué es exactamente lo que hace que un rasgo sea un rasgo parece un poco polémica en los detalles. Tal vez otra pregunta podría responderse: ¿hay una lista completa de cuáles de las clases similares a rasgos son nuevas en C ++ 0x y cuáles ya han estado en C ++ 03? Tal vez alguien sabe de un enlace a algún lugar?
Aquí hay un intento de lista de los rasgos divididos por estándar. Podría fácilmente pasar por alto a algunos.
Nuevos rasgos de C ++ 11:
is_error_code_enum
is_error_condition_enum
pointer_traits
allocator_traits
Just about everything in <type_traits>
treat_as_floating_point
duration_values
uses_allocator
regex_traits
C ++ 98/03 rasgos:
numeric_limits
char_traits
iterator_traits
El que realmente amo que va de la mano con los nuevos tipos de clases de enumeración es
subyacente_tipo :: tipo que le proporciona el tipo del especificador de almacenamiento de la clase enum
enum class My_Enum : unsigned int { ... }
underlying_type<My_Enum>::type -> unsigned int
Muy útil en conversiones de enumeración y serialización.
Un rasgo (tipo) es una meta función simple en la programación genérica. Toma un tipo y devuelve un conjunto de valores, funciones y funciones meta que describen algunos aspectos de ese tipo.
Eso significa que un rasgo es una plantilla de clase C ++. Las clases base de iterador como std::forward_iterator_tag
no son rasgos, por ejemplo.
Notas : algunos de los valores de un rasgo pueden ser de naturaleza booleana. Debido a las restricciones de la plantilla de C ++, los valores de los rasgos no pueden ser de tipo punto flotante. Sin embargo, los rasgos también pueden contener funciones, y esas funciones no tienen restricciones en el tipo de devolución.
Las clases de rasgos puros contienen solo miembros estáticos; No hay simple datos de instancia relevantes. Por esa razón, tampoco contienen constructores. Esta distinción "pura" nos permite describir clases como std::vector<T>
como clases de rasgos no puros: son sus propias clases de rasgos, en efecto.
- * numeric_limits * definitivamente representa un conjunto de rasgos para los tipos numéricos.
- todos los requisitos como "CopyAssignable", etc. son rasgos, consulte este documento sobre rasgos
Para los demás no puedo comentar pero en caso de duda:
Piense en un rasgo como un objeto pequeño cuyo propósito principal es llevar la información utilizada por otro objeto o algoritmo para determinar la "política" o los "detalles de implementación". - Bjarne Stroustrup
Actualización: solo para hacer mi pequeña contribución a la extensa lista que Howard proporcionó:
- rasgos relacionados con el tiempo
- rasgos regex
Estaba equivocadamente bajo la impresión de que los rasgos de tipo y los rasgos de expresión regular que son parte del TR1 técnicamente no son parte del conjunto de nuevos rasgos en C ++ 0x (aunque los rasgos de tipo se han extendido en gran medida por la nueva norma próxima). Ver el comentario y aclaración de Howard sobre eso.