2012-10-15 87 views
5

我与可变参数模板实验和想知道他们是否能按顺序使用generalze的访问成员(?)类模板,如Initialzing和可变参数类模板

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

另外,我我希望能够通过链接构造函数初始化所有成员。这是多远,我已经得到了:

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

其目标是创建出象这样的对象:

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

的代码无法编译器(gcc 4.5.3)出现错误:

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 

编辑

什么是重的最佳方式请问Foo的各个成员?

+3

您是否在寻找'的std :: tuple'? – pmr

+0

@pmr谢谢。 std :: tuple做了一件了不起的工作。 C++ x11非常棒! – Olumide

回答

4

你必须这样做:用...扩展来自参数包(可变参数)的变量。

也就是说,不是

Foo<Types ...>(others) 

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

谢谢。你如何建议我这样做?这是我第一次进入可变模板。 – Olumide

+0

谢谢!有效!!! – Olumide

+0

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