2013-05-13 74 views

回答

7

只需使用省略号。每款C++ 11标准的5.1.2/23:

A capture followed by an ellipsis is a pack expansion (14.5.3). [ Example:

template<class... Args> 
void f(Args... args) { 
    auto lm = [&, args...] { return g(args...); }; 
    lm(); 
} 

end example ]

注:有趣的是,GCC拒绝编译这个(见live example):

template <class T, class... A> 
void foo(T&& func, A&&... args) { 
    std::function<void()> task([func, args...]() { 
     //... 
    }); 
} 

但考虑到上述来自标准的例子,这绝对是一个编译器问题。

+0

令人惊讶的是,你是否记住了整个标准或只是做一个快速的样子? – maverik 2013-05-13 17:25:01

+0

@maverik:当然我做了一个快速的检查;) – 2013-05-13 17:25:56

+0

看起来像这个海湾合作委员会的错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41933(你的报价是一个相当晚的除标准) – 2013-05-13 17:53:55

3

当您在拍摄使用args,你需要省略号:

template <class T, class... A> 
void tpool::enqueue(T&& func, A&&... args) { 
    std::function<void()> task([func, args...]() { 
     //... 
    }); 
} 
+0

我试过你的代码,但不能再次编译。 'error:expected','before'...'token''错误:'...'token'之前的预期标识符'错误:参数包没有用'...'扩展' – Mpac 2013-05-13 17:35:28

+0

@ MarcoPacini您使用的是GCC吗?在这种情况下,编译器中似乎存在一个错误(例如[Andy Prowl回答](http://stackoverflow.com/a/16527660/440558))。 – 2013-05-13 17:38:34

+0

是的,我使用安装了macport的GCC 4.7.2。 – Mpac 2013-05-13 17:42:18