Ich versuche Code zu schreiben, der ein Member typedef eines Template-Arguments verwendet, aber einen Standardtyp angeben möchte, wenn das Template-Argument diesen Typdef nicht hat. Ein vereinfachtes Beispiel habe ich versucht, ist dies:Template-Spezialisierung zur Verwendung des Standardtyps, wenn das Klassenelement typedef nicht existiert
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;
}
Ich würde erwarten, dass dieses „Default Nicht-Standard“ drucken, sondern druckt „Default“. Meine Erwartung ist, dass die zweite Zeile in main() mit der spezialisierten Version von Get_Type übereinstimmen sollte, weil B :: Type existiert. Dies geschieht jedoch nicht.
Kann mir jemand erklären, was hier vor sich geht und wie man es repariert, oder einen anderen Weg, um dasselbe Ziel zu erreichen?
Vielen Dank.
Edit:
Georg gab eine alternative Methode, aber ich bin immer noch neugierig, warum dies nicht funktioniert. die den Auftrieb enable_if docs nach, eine Möglichkeit, eine Vorlage für verschiedene Typen spezialisiert ist etwa so:
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> { ... };
Dies funktioniert, weil enable_if < true> als typedef hat geben, aber enable_if < false> nicht.
Ich verstehe nicht, wie dies anders ist als meine Version, wo anstelle von enable_if verwende ich nur T :: Type direkt. Wenn T :: Type existiert, wäre das nicht dasselbe wie enable_if < true> :: type im obigen Beispiel und die Spezialisierung wird gewählt? Und wenn T :: Type nicht existiert, wäre das nicht dasselbe wie enable_if < false> :: type not exists und verursacht die Standardversion im obigen Beispiel gewählt?
Uh verwenden .. was ist das Ziel? –
Das Ziel ist, dass Get_Type :: Type wird T :: Type, wenn es existiert, oder DefaultType, wenn es nicht existiert. –
Frank