2012-10-15 15 views
5

ich mit variadische Vorlagen bin experimentieren und würde gerne wissen, ob sie in verwendet werden können, um generalze (?) Klasse Vorlagen wieinitialzing und den Zugriff auf Mitglieder einer variadische Klassenvorlage

template<typename T1, typename T2 , typename T4, typename T4> 
struct Foo 
{ 
    T1  &m_member1; 
    T2  &m_member2; 
    T3  &m_member3; 
    T4  &m_member4; 
}; 

Auch ich Ich möchte in der Lage sein, alle Mitglieder durch Verketten von Konstruktoren zu initialisieren. Dies ist, wie weit ich bekommen habe:

template<typename... Types> 
struct Foo; 

template<typename T , typename... Types> 
struct Foo<T, Types ...> : public Foo<Types ...> 
{ 
    Foo(T member , Types ... others) : m_member(member) , Foo<Types ...>(others) 
    { 
    } 

    T m_member; 
}; 

template<typename T> 
struct Foo<T> 
{ 
    Foo(T member) : m_member(member) 
    { 
    } 

    T m_member; 
}; 

, wo das Ziel ist es, Objekte zu erstellen, wie so:

Foo<char,int,bool,float> f('a' , 42 , true , 1.234); 

Der Code fehlschlägt (gcc 4.5.3) mit dem Fehler zu kompilieren:

TestVariadicTemplates.cpp: In constructor ‘Foo<T, Types ...>::Foo(T, Types ...)’: 
TestVariadicTemplates.cpp:15:83: error: parameter packs not expanded with ‘...’: 
TestVariadicTemplates.cpp:15:83: note:   ‘others’ 
TestVariadicTemplates.cpp:15: confused by earlier errors, bailing out 

bearbeiten

Was wäre der beste Weg, um wieder die verschiedenen Mitglieder von Foo?

+3

Suchen Sie 'std :: tuple'? – pmr

+0

@pmr Danke. std :: tuple macht einen wunderbaren Job. C++ x11 ist erstaunlich !!! – Olumide

Antwort

4

Sie müssen tun, was es sagt: Erweitern Sie die Variablen, die von Parameter-Packs (Variadic-Parameter) mit ... kommen.

Das heißt, statt

Foo<Types ...>(others) 

Schreib

Foo<Types ...>(others...) 
+0

Danke. Wie schlägst du vor, dass ich das tue? Dies ist mein erster Ausflug in variadische Vorlagen. – Olumide

+0

Danke! Es funktionierte!!! – Olumide

+0

@Olumide: [Online-Demo] (http://liveworkspace.org/code/7a9e302e6ec73e49837878b28f65d4dc) – ildjarn

Verwandte Themen