2013-10-25 72 views
0

我是C++ 11的可变参数模板的新手,不知道我做错了什么是简单的语法错误,或者是不可能的。 我想写点东西像下面这样:动态类成员

template< typename... Args > 
struct Test 
{ 
    Args... args; 
    Test(Args... args_) : args(args_...) { 
    } 
}; 

基本上这个类需要有“伪动态成员”。 我有试过这样:

struct A {}; 
template< typename... Args > 
A* MakeB(Args... args) 
{ 
    struct B : public A 
    { 
     Args... args; 
     B(Args... args_) : args(args_...) { 
     } 
    }; 
    return new B; 
}; 

是不可能,还是我只是不擅长与可变参数模板?

回答

4

包不是类型,不能像类型一样使用。它们是仅用于模板的特殊构造。你不能拥有“包装成员”。

典型的解决方案是有一个元组成员:

#include <tuple> 

template< typename... Args > 
struct Test 
{ 
    std::tuple<Args...> args_; 

    Test(Args const &... args) 
    : args_(args_...) 
    { } 
}; 

你的小壶应该是这样的:

template <typename ...Args> 
Test<Args...> make_test<Args const &... args) 
{ 
    return Test<Args>(args...); 
} 

用法:

auto t = make_test(1, true, 'x'); // makes a Test<int, bool, char> 
+0

有没有一种方法来提取数据,所以我可以使用扩展语法将成员放入一个有效的函数调用,即func(args ...); ? –

+1

@TheFloatingBrain请参阅http://stackoverflow.com/q/687490/420683 – dyp