Ich habe ein Problem mit variadische Template-Vorlagen:Template-Template-Syntax Probleme mit variadische Vorlagen
template <typename T> class A { };
template< template <typename> class T> class B { };
template <template <typename> class T, typename parm> class C { typedef T<parm> type; };
template <typename... types> class D { };
template <template <typename...> class T, typename ... parms> class E { typedef T<parms...> type; };
// How to pass list in list??
template < template <typename...> class ...T, ???>
class F
{
};
zunächst eine Art der Vorlage passieren, kein Problem:
A<int> a; //ok
Jetzt möchte ich Erstellen Sie eine Instanz von B, aber keine Möglichkeit, die Vorlage Vorlage Parameter übergeben:
B<A> b; // ok, but no chance to submit <int> inside A!
Also ich muss die pa erweitern rameter Liste:
C<A, int> c; // ok, this transport int as parm into A
Jetzt habe ich mit variadische Vorlagen in üblichen Weise spielen:
D<> d1; // ok
D<int, float, double> d2; //ok
Parameter in den variadische Teil Passing ist auch Straße nach vorn:
E<D> e1; //ok
E<D, double, float, int> e2; //ok
ABER: Wenn ich will, Um eine Liste von Listen zu haben, finde ich keine Syntax, die es mir ermöglicht, Parameterlisten an die Liste der Typen zu übergeben. Was meine Absicht ist so etwas. aber auch das obige Beispiel zeigt, dass B<A<int>> b;
ein Fehler ist! So könnte das folgende Beispiel nicht funktionieren :-(
F< D< int, float>, D< int>, D <float, float, float> > f;
Mein Ziel ist es, die Liste von Listen über Template-Spezialisierung entrollen. Irgendwelche Hinweise?
Meine Lösung, nachdem ich das Problem verstanden. Danke!
Jetzt kann ich meine variadic variadic Vorlagenvorlage wie im folgenden Beispiel ausrollen Das einfache Problem war, dass ich auf eine Vorlagenklasse und nicht auf einen einfachen Typ warte Manchmal kann die Lösung so einfach sein :-)
Das ist mein Arbeitsergebnis jetzt:
template <typename ... > class D;
template <typename Head, typename... types>
class D<Head, types...>
{
public:
static void Do() { cout << "AnyType" << endl; D<types...>::Do(); }
};
template<>
class D<>
{
public:
static void Do() { cout << "End of D" << endl; }
};
template < typename ...T> class H;
template < typename Head, typename ...T>
class H<Head, T...>
{
public:
static void Do()
{
cout << "unroll H" << endl;
cout << "Subtype " << endl;
Head::Do();
H<T...>::Do();
}
};
template <>
class H<>
{
public:
static void Do() { cout << "End of H" << endl; }
};
int main()
{
H< D<int,int,int>, D<float, double, int> >::Do();
return 0;
}
Danke, deine Antwort öffne meine Augen. Ich habe meine letzte Lösung für meine Frage gefunden. Hoffe das hilft jemand anderem. – Klaus