Gibt es eine Technik/besten Stil, um Klassenschablonenspezialisierungen für bestimmte Typen zu gruppieren?Gruppenklassenschablonenspezialisierungen
Ein Beispiel: Nehmen wir an ich eine Klassenvorlage haben Foo
und ich brauche es die gleiche
A = { Line, Ray }
für die typeset B
und auf eine andere Weise
B = { Linestring, Curve }
spezialisiert haben
Was ich bisher mache: (die Technik wird auch präsentiert here für Funktionen)
#include <iostream>
#include <type_traits>
using namespace std;
// 1st group
struct Line {};
struct Ray {};
// 2nd group
struct Curve {};
struct Linestring {};
template<typename T, typename Groupper=void>
struct Foo
{ enum { val = 0 }; };
// specialization for the 1st group
template<typename T>
struct Foo<T, typename enable_if<
is_same<T, Line>::value ||
is_same<T, Ray>::value
>::type>
{
enum { val = 1 };
};
// specialization for the 2nd group
template<typename T>
struct Foo<T, typename enable_if<
is_same<T, Curve>::value ||
is_same<T, Linestring>::value
>::type>
{
enum { val = 2 };
};
int main()
{
cout << Foo<Line>::val << endl;
cout << Foo<Curve>::val << endl;
return 0;
}
Eine zusätzliche Hilfsstruktur würde den Code verkürzen (und erlauben, die akzeptierten Typen direkt zu schreiben). Irgendwelche anderen Vorschläge, Korrekturen? Sollte dies nicht mit weniger Aufwand verbunden sein?
Sie können auch eine * type_traits * nach Gruppe erstellen. – Jarod42
@Angew: autsch, ich habe die Basisvorlage verpasst. Sie haben Recht, das sind zwei Spezialisierungen. –