24 votos

¿Qué tipo de "Rasgos" son usados/definido en el Estándar de C++0x

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

Pero no todos los rasgos tienen "rasgo" en su nombre, a la derecha? numeric_limits viene a la mente. Es este un "Rasgo", también? Incluso sin el nombre de "rasgo" en ella?

Así, hay otras Plantillas que podría/debería ser considerado como un "Rasgo"? Además de los ejemplos que he encontrado:

  • allocator_traits cómo llegar memoria
  • pointer_traits cómo obtener acceso a un objeto indirectamente
  • type_traits meta programación
  • char_taits para la secuencia de símbolos
  • iterator_traits cómo llegar hacia adelante, hacia atrás y a los elementos
  • regex_traits de... expresiones regulares.

Supongo que, lo que yo estoy pidiendo, también, hay una pura definición de los rasgos?

Algunas cosas estoy muy seguro acerca de:

  • numeric_limits mencionado anteriormente
  • <chrono>s de personalización "rasgos", [20.11.4], es decir, duration_values
  • ¿qué acerca de Hash? Puede el functor hash<> a ser considerado como un rasgo?
  • Si ese es el caso, no son todos los requisitos de "rasgos", como "CopyAssignable", etc?
  • Y entonces, de los abandonados, de los "Conceptos" el último "rasgo"Definición?

Actualización: La pregunta ¿qué hace que un rasgo, una característica que parece un poco de controversia en los detalles. Tal vez una que otra pregunta podría ser respondida: ¿hay una lista completa de que el rasgo-como las clases son nuevos en C++0x, y que ya han sido en C++03? Tal vez alguien sabe de un enlace a algún sitio?

10voto

Howard Hinnant Puntos 59526

Aquí es un intento de lista de los rasgos dividido por la norma. Yo fácilmente podría ser vistas a algunos.

nuevo C++11 rasgos:

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

8voto

celavek Puntos 2107

  • *numeric_limits* sin duda representa un conjunto de rasgos para los tipos numéricos.
  • todos los requisitos como "CopyAssignable", etc. de hecho son los rasgos consulte este documento en los rasgos

    Para los otros que no puedo comentar, pero en caso de duda:

    Creo que de un rasgo como un objeto pequeño cuyo propósito principal es llevar a la información utilizada por otro objeto o algoritmo para determinar la "política" o "los detalles de implementación". - Bjarne Stroustrup

    Actualización: solamente hacer mi pequeña contribución a la extensa lista de Howard siempre:

  • relacionados con el tiempo traites
  • regex rasgos

Me fue erróneamente bajo la impresión de que el tipo de rasgos y la expresión de los rasgos que son parte de la TR1 son técnicamente no es parte de la nueva rasgos montón en C++0x(aunque el tipo de rasgos se han extendido mucho por el nuevo estándar próximo). Ver Howard comentario y aclaración acerca de eso.

4voto

MSalters Puntos 74024

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

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

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

Puro rasgo clases contienen sólo los miembros estáticos; hay simples relacionados con los datos de la instancia. Por esa razón, no contienen los constructores. Este "puro" distinción nos permite describir las clases como std::vector<T> como no-puro rasgo de clases: están en su propio rasgo de clases, en efecto.

1voto

David Puntos 1773

El que yo realmente amor que va de la mano con la nueva clase enum tipos de

underlying_type::el tipo que le da el tipo de almacenamiento, con el especificador de la clase enum

enum class My_Enum : unsigned int { ... }

underlying_type<My_Enum>::type -> unsigned int

Muy útil en la enumeración de las conversiones y la serialización.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X