2011-05-25 7 views
5

He estado tratando de leer los encabezados de los rasgos de los tipos de Boost, y ahora me siento bastante enfermo dada la intensa falta de lectura proporcionada por innumerables #define. Y luego un poco más #definir.Boost type_traits is_array

Para ser específico, estoy interesado en averiguar sobre los siguientes 3 rasgos: si un tipo T es una matriz, una clase o una enumeración.

¿Alguien puede ayudar a sugerir alguna forma de descifrar el método detrás de la aparente locura? Al igual que la teoría detrás de cómo averiguar el rasgo de un tipo, cualquier material de lectura relevante etc.

+0

Una forma de deshacerse de incontables ifdefs que le molestan es ejecutar el preprocesador de código a través, es decir, usar la opción '-E' con' gcc'. Luego puede consultar el código que compilará su plataforma para su plataforma. Generalmente, los rasgos se implementan usando SFINAE, especialización de plantilla (parcial) y extensiones específicas del compilador. –

+0

+1 para que sus agallas se sumerjan en los encabezados de impulso. ;) De hecho, solo puedo recomendar eso, especialmente los encabezados de Boost.Function, que son bastante educativos para mí. – Xeo

Respuesta

4

is_array es bastante simple y directo:

template<class T> 
struct is_array{ 
    static const bool value = false; 
}; 

template<class T, std::size_t N> 
struct is_array< T (&)[N] >{ 
    static const bool value = true; 
}; 

Sólo una especialización parcial simple en una referencia-a tipo de matriz

is_class es un poco más complicado y se basa en la resolución de sobrecarga y en el hecho de que las clases y struct poseen constructores (o destructores). Como estoy actualmente en mi iPod Touch, realmente no puedo mostrar un ejemplo. Editaré una tan pronto como tenga acceso a una PC nuevamente.

is_enum depende de los intrínsecos del compilador Creo, así que no hay ningún ejemplo allí.

Nota: Todo aquí es de memoria, podría estar equivocado con la enumeración.

+0

Tienes razón sobre 'is_enum', y lo mismo ocurre con' is_pod'. – ildjarn

+0

@ildjarn: Creo que en Visual C++ todo rasgo de tipo se implementa utilizando intrínsecos/extensiones del compilador hasta donde he visto. Después de todo, el compilador conoce mejor los tipos, ¿no? ':)' – Xeo

+0

@Xeo: Lo que quise decir es que esos dos rasgos de tipo en particular solo pueden implementarse con el uso de intrínsecos del compilador, mientras que el resto se puede implementar con metafunciones simples. – ildjarn