2015-09-05 81 views
1
template<typename FirstArgT, typename...ArgsT> 
class Server :public Server<ArgsT...> { 
public: 
    Server(const function<void (FirstArgT, ArgsT...)>& func) 
     :Server<ArgsT...>([&](ArgsT args...) -> void { func(arg0, args...); }) { } 

private: 
    FirstArgT arg0; 
} 

但是编译器说:如何使用可变参数参数拉姆达从可变参数模板类

错误C3520“ArgsT”:参数包必须在这方面

错误C3546”扩大... “:存在可用于扩大

在线路4和5

没有参数包是否有可能使用可变参数作为参数的λ的参数是VS2015,或我有没有其他方法可以做到这一点?

+2

'ArgsT ... args'不'ArgsT ARGS ...' –

+0

[OT]:我不能告诉你实际上在做什么,但捕捉'引用func'可能是一个坏主意 –

+0

我想用C++ 11的功能 – AlexWang

回答

0

我扩展并修复了您的代码以使其得到编译。如果你的下一个问题带有完整的例子让大家有没有需要延长的例子其余这将是很好;)

事实上,我不知道你的代码是好的:-)

template<typename ...T> class Server; 

template<typename FirstArgT, typename...ArgsT> 
class Server<FirstArgT,ArgsT...> :public Server<ArgsT...> { 
    public: 
     Server(const std::function<void (FirstArgT, ArgsT...)>& func) 
      :Server<ArgsT...>([&](ArgsT ... args)-> void { func(arg0, args...); }) { } 

    private: 
     FirstArgT arg0; 
}; 

template<typename FirstArgT> 
class Server<FirstArgT> 
{ 
    public: 
    Server(const std::function<void (FirstArgT)>& func) {} 
}; 


void Do(int, double) {} 


int main() 
{ 
    Server<int,double> se(&Do); 
} 

如果您的意图只是将参数存储在某处并使用存储的参数调用该函数,则只需使用std::bind即可。

void Do(int i, double d) { std::cout << i << " " << d << std::endl; } 

int main() 
{ 
    auto fx= std::bind(&Do, 1, 2.34); 
    fx(); 

    // which works also for lambda: 
    auto fx2= 
    std::bind([](int i,double d)->void 
     { std::cout << i << " " << d << std::endl; }, 4, 5.6); 

} 
+0

谢谢,我确实想存储这些参数并在别处叫它。谢谢你告诉我绑定 – AlexWang