Estoy intentando escribir código que usa un miembro typedef de un argumento de plantilla, pero quiero proporcionar un tipo predeterminado si el argumento de plantilla no tiene ese typedef. Un ejemplo simplificado que he probado es la siguiente:Especialización de plantillas para usar el tipo predeterminado si el miembro de clase typedef no existe
struct DefaultType { DefaultType() { printf("Default "); } };
struct NonDefaultType { NonDefaultType() { printf("NonDefault "); } };
struct A {};
struct B { typedef NonDefaultType Type; };
template<typename T, typename Enable = void> struct Get_Type {
typedef DefaultType Type;
};
template<typename T> struct Get_Type< T, typename T::Type > {
typedef typename T::Type Type;
};
int main()
{
Get_Type<A>::Type test1;
Get_Type<B>::Type test2;
}
yo esperaría esta opción para imprimir "no predeterminado por defecto", pero en su lugar se imprime "por defecto por defecto". Mi expectativa es que la segunda línea en main() debe coincidir con la versión especializada de Get_Type, porque B :: Type existe. Sin embargo, esto no sucede.
¿Alguien puede explicar lo que está pasando aquí y cómo solucionarlo, u otra forma de lograr el mismo objetivo?
Gracias.
Editar:
Georg dio un método alternativo, pero todavía estoy curioso acerca de por qué esto no funciona. Según el impulso del enable_if docs, una manera de especializarse una plantilla para diferentes tipos es de esta manera:
template <class T, class Enable = void>
class A { ... };
template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };
template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };
Esto funciona porque enable_if < cierto> tiene el tipo como un typedef, pero enable_if < falsa> no lo hace.
No entiendo cómo es esto diferente de mi versión, donde en lugar de usar enable_if solo estoy usando T :: Type directamente. Si existe T :: Type, ¿no sería lo mismo que enable_if < true> :: escribir en el ejemplo anterior y hacer que se elija la especialización? Y si T :: Type no existe, ¿no sería lo mismo que enable_if < false> :: type no existir y hacer que la versión predeterminada sea elegida en el ejemplo anterior?
Uh .. ¿cuál es el objetivo? –
El objetivo es que Get_Type :: Type sea T :: Type si existe, o DefaultType si no existe. –
Frank