2012-10-15 29 views
5

Jestem eksperymentowanie z szablonów o zmiennej liczbie argumentów i chcieliby wiedzieć, czy mogą one być wykorzystywane w celu generalze (?) Szablonów klas takich jakInitialzing i członkach korzystające o zmiennej liczbie argumentów klasy szablonu

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

Również, chciałby zainicjować wszystkich członków poprzez łańcuchy konstruktorów. Jest to, jak daleko stałam:

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; 
}; 

gdzie celem jest stworzenie obiektów tak:

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

kod nie skompilować (gcc 4.5.3) z błędem:

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 

Edit

Jaki byłby najlepszy sposób, aby ponownie różnych członków Foo?

+3

Szukasz 'std :: tuple'? – pmr

+0

@pmr Dzięki. std :: tuple wykonuje cudowną pracę. C++ x11 jest niesamowity !!! – Olumide

Odpowiedz

4

Musisz zrobić, co mówi: Rozwiń zmienne, które pochodzą z Pakiety parametrów (parametry wariadyczne) z ....

Oznacza to, że zamiast

Foo<Types ...>(others) 

zapisu

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

Dzięki. Jak sugerujesz, że to robię. To moja pierwsza wizyta w szablonach variadycznych. – Olumide

+0

Dzięki! Zadziałało!!! – Olumide

+0

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

Powiązane problemy