2015-09-05 36 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