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?
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.
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
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.
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.
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