c++ c++11 traits typetraits

¿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<> functor hash<> 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.