Qué tipo de "Rasgos" se utilizan / definen en el estándar C++0x


Un rasgo en C++ encapsula una familia de operaciones que permiten que un Algoritmo o Estructura de Datos opere con ese tipo con el que se instancian. char_traits son un ejemplo para agrupar string - y las funciones requeridas por el archivo.

Pero no todos los rasgos tienen "rasgo" en su nombre, ¿verdad? numeric_limits viene a la mente. ¿Esto también es un "Rasgo"? ¿Incluso sin el nombre "rasgo"?

Entonces, ¿hay otras Plantillas que podrían / deberían considerarse un "Rasgo"? Además 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 la secuencia de símbolos
  • iterator_traits cómo avanzar, retroceder y llegar al elemento
  • regex_traits para... regexes.

Supongo, lo que estoy preguntando, también, ¿hay una definición pura para rasgos?

Algunas cosas de las que estoy especialmente inseguro son:{[14]]}

  • numeric_limits antes mencionado
  • <chrono> s personalización "rasgos", [20.11.4], es decir, duration_values
  • ¿qué pasa con el Hashing? ¿Se puede considerar que el funtor hash<> es un rasgo?
  • Si ese es el caso, ¿no son todos los requisitos "rasgos", como" CopyAssignable", etc.?
  • Y entonces, ¿son los "Conceptos" abandonados la definición última de "rasgo"?

Actualizar: La pregunta qué hace exactamente un rasgo un rasgo parece un poco polémica en los detalles. Tal vez una otra pregunta podría responderse: ¿Hay una lista completa de las clases similares a trait que 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?

Author: towi, 2011-07-16

4 answers

  • *numeric_limits* definitivamente representa un conjunto de rasgos para los tipos numéricos.
  • todos los requisitos como "CopyAssignable", etc. son rasgos de hecho ver 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 información utilizada por otro objeto o algoritmo para determinar la " política" o "detalles de implementación". - Bjarne. Stroustrup

    Actualización: para hacer mi pequeña contribución a la extensa lista Howard proporcionó:

  • traites relacionados con el tiempo
  • rasgos regex

Tuve la impresión errónea de que los type traits y regex traits que forman parte del TR1 técnicamente no son parte del nuevo grupo de rasgos en C++0x(a pesar de que los rasgos de tipo se han extendido mucho por el nuevo estándar próximo). Ver el comentario de Howard y aclaración al respecto.

 8
Author: celavek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-01 08:02:59

Aquí hay una lista de los rasgos divididos por estándar. Podría fácilmente estar pasando por alto 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

Características de C++98/03:

numeric_limits
char_traits
iterator_traits
 10
Author: Howard Hinnant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-31 15:08:33

Un rasgo (tipo) es una meta-función simple en programación genérica. Toma un tipo y devuelve un conjunto de valores, funciones y meta-funciones que describen algunos aspectos de ese tipo.

Eso significa que un rasgo es una plantilla de clase C++. Las clases base del iterador como std::forward_iterator_tag no son rasgos, por ejemplo.

Notas - Algunos de los valores en un rasgo pueden ser de naturaleza booleana. Debido a las restricciones de plantilla de C++, los valores de rasgo no pueden ser de tipo de punto flotante. Sin embargo, rasgos también puede contener funciones, y esas funciones no tienen restricciones en el tipo de retorno.

Las clases de rasgos puros solo contienen miembros estáticos; simplemente no hay 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.

 4
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-18 09:32:46

El que realmente me encanta que va de la mano con los nuevos tipos de clase enum es

Underlying_type:: type que le da 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 enumeraciones y serialización.

 1
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-07 01:18:49