2014-04-09 3 views
8

Zum Beispiel habe ich einen Code wie unten mit zwei Parametern PackWie man zwei Parameterpakete zusammen benutzt?

template<class... Ts, int... Is> 
struct B 
{ 

}; 

int main() 
{ 
    B<int, double, 0, 1> b; // compile error here 
    return 0; 
} 

Jeden Weg ist richtig zu machen?

+3

Lassen Sie B nur 2 Typparameter eingeben, dann verwenden Sie 'B , intlist <0,1>>'. –

+5

Ich denke, Sie wollten zwei Parameterpakete sagen, nicht zwei variadische Vorlagen. – chris

+0

'B , 0, 1>' sollte funktionieren. Alles, was Sie brauchen, um 'typelist' zu definieren, was nur eine Zeile ist. Siehe meine Antwort. – Nawaz

Antwort

6

Das ist nicht erlaubt. Sie können dies jedoch tun:

template<typename ...> struct typelist {}; 

template<typename TypeList, int... Is> 
struct B;        //primary template. Only declaration! 

template<typename ... Ts, int ... Is> 
struct B<typelist<Ts...>, Is...>   //partial specialization 
{ 
    //here you know Ts... and Is... Use them! 
}; 

int main() 
{ 
    B<typelist<int, double>, 0, 1> b; 
    return 0; 
} 
+0

Schön. Ihre Struktur 'typelist', ich nenne es normalerweise 'pack'. – iavr

2

Sie könnten Helfer Vorlagen einführen Listen von Arten/Zahlen vorstellen:

template<typename TList, typename IList> struct X; 

template< 
    template<typename ...> class TList, typename ...Ts, 
    template<int ...> class IList, int ...Is> 
struct X <TList<Ts...>, IList<Is...> > 
{ 

}; 

template<typename ...Ts> struct TList {}; 
template<int ...Is> struct IList {}; 

int main() 
{ 
    X<TList<int, double>, IList<0, 1> > x; 
    return 0; 
} 
+0

'IList' wird nicht benötigt, wenn' TList' vorhanden ist. – Nawaz

+0

Ich weiß, aber es sieht sauberer für mich aus. –

+0

Wie ich sehe, '' Vorlage Klasse TList, Typname ... Ts "' sieht mir hässlicher, im Vergleich zu nur 'typename TypeList'. : | ... Aber das hat nichts mit meinem früheren Kommentar zu tun, denn es kann neu geschrieben werden, um es besser zu machen. – Nawaz

2

Ich denke, das leidet unter dem XY-Problem. Wenn ich es gut verstanden habe, möchte ich eine beliebige Anzahl von Zahlen verschiedener Typen weitergeben.

Sie konnten das std::integral_constant mit tun:

template<typename... INTS> 
struct foo 
{ 
    ... 
}; 

template<typename T , T n> 
using number = std::integral_constant<T,n>; //An alias for less typing... 

foo<number<int,-1>,number<unsigned int,1>, /* etc */>; 

Wenn das ist nicht das, was Sie wollen, würde ich die Typliste Teilspezialisierung Ansatz andere vorgeschlagen verwenden.