Templatespezialisierung
-
Also in einem anderen Header habe ich typedefs. Eins davon ist z.B. a. Und das typedef b ist entweder ein typedef von a oder - je nach Plattform - etwas obskures Plattformspezifisches. Nun möchte ich ein Klassentemplate spezialisieren und zwar so, dass man auf jeder Plattform sowohl a als auch b übergeben kann. Wenn a und b unterschiedliche Typen sind geht das tadellos. Aber wenn sie in Tat und Wahrheit derselbe Typ sind schlägt das selbstverständlich fehl (wie soll der Compiler auch wissen welche Spezialisierung gemeint ist?). Wie löst man das Problem?
PS: Damit man es sich bisschen besser vorstellen kann:
typedef /*...*/ a; typedef /*...*/ b; //kann u.U. a sein (Templatemagie und Präprozessorstatemets entscheiden es) template<typename T> //hat im echten Fall noch mehr Template-Parameter struct Foo { }; //und auch mehr Spezialisierungen template<> struct Foo<a> : public Impl { }; template<> struct Foo<b> : public Impl { };Gruß und danke im Voraus
-
template<> struct Foo<a> : public Impl { }; template<> struct Foo<typename std::conditional<std::is_same<a, b>::value, int*****, b>::type> : public Impl { };So vielleicht? Die Idee wäre dass die zweite explizite Spezialisierung einfach auf einen total anderen Typ spezialisiert wird falls
aundbden gleichen Typ bezeichnen.Edit: Ein weiterer Beweis dass
static_ifein super Feature gewesen wäre...
-
Schick, ja das löst mein Problem. Danke.
-
Arcoth schrieb:
Edit: Ein weiterer Beweis dass
static_ifein super Feature gewesen wäre...
Nicht nur static_if, auch compile-time Type-Vergleiche:
template <> struct Foo<a == b ? int***** : b> {}