Sí, defina una segunda plantilla "getter" con especialización parcial.
template<typename>
struct get_Small_X; // base template is incomplete, invalid
template< typename X > // only specializations exist
struct get_Small_X< Small<X> > {
typedef X type;
};
Ahora en lugar de Small<X>::X
que tienen typename get_Small_X< Small<X> >::type
.
Por cierto, _X
es un identificador reservado, por lo que no debe usarlo para nada. X_
es una mejor opción.
Tema avanzado: plantilla de introspección.
Mientras lo pienso, no necesita definir esto por separado para cada plantilla. Una sola plantilla maestra debería hacerlo.
Esto se compila en Comeau, sé que hay reglas sobre la coincidencia de argumentos de plantilla, pero creo que está bien ... los argumentos de la plantilla están prohibidos en la plantilla maestra en especialización parcial.
template<typename>
struct get_first_type_argument;
template< template<typename> class T, typename X >
struct get_first_type_argument< T<X> > {
typedef X type;
};
template< typename X >
struct simple;
get_first_type_argument< simple<int> >::type q = 5;
Esto solo funciona con plantillas "unarias" pero podría adaptarse en C++ 0x para el caso general.
El nombre '_X' está reservada en C++; es mejor que nunca prefieras los nombres con un guión bajo, de esa manera no tienes que preocuparte por las diversas reglas de subrayado. –
Uups - fue solo por el ejemplo, pero es bueno saberlo. – Danvil