如何在lambda函数中捕获可变数量的参数

时间:2013-05-13 17:18:10

标签: c++ templates c++11 lambda

我尝试了以下代码,但没有编译。

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

2 个答案:

答案 0 :(得分:7)

只需使用省略号即可。根据C ++ 11标准的第5.1.2 / 23段:

  

捕获后跟省略号是包扩展(14.5.3)。 [示例

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

- 结束示例]

注意:有趣的是,GCC拒绝编译(请参阅live example):

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

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

答案 1 :(得分:3)

在捕获中使用args时,需要省略号:

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