Sto provando a scrivere codice che utilizza un typedef membro di un argomento modello, ma voglio fornire un tipo predefinito se l'argomento modello non ha quel typedef. Un esempio semplificato che ho provato è questo:Specializzazione modello per utilizzare il tipo predefinito se il membro della classe typedef non esiste
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;
}
mi aspetto questo per stampare "Default non predefinite", ma invece esso stampa "Default Default". La mia aspettativa è che la seconda riga in main() corrisponda alla versione specializzata di Get_Type, perché B :: Type esiste. Tuttavia, questo non succede.
Qualcuno può spiegare cosa sta succedendo qui e come risolverlo o un altro modo per raggiungere lo stesso obiettivo?
Grazie.
Edit:
Georg ha dato un metodo alternativo, ma io sono ancora curioso di sapere il motivo per cui questo non funziona. Secondo la la spinta enable_if docs, un modo di specializzarsi un modello per i diversi tipi è in questo modo:
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> { ... };
Questo funziona perché enable_if < vera> ha caratteristiche di un typedef, ma enable_if < false> non lo fa.
Non capisco come questo sia diverso dalla mia versione, dove invece di usare enable_if sto usando solo T :: Type direttamente. Se T :: Type esiste non è lo stesso di enable_if < true> :: type nell'esempio sopra e causa la specializzazione da scegliere? E se T :: Type non esiste, non sarebbe lo stesso di enable_if < false> :: type non esistente e causando la scelta della versione predefinita nell'esempio sopra?
Uh .. qual è l'obiettivo? –
L'obiettivo è che Get_Type :: Type sarà T :: Type se esiste, o DefaultType se non esiste. –
Frank