传递给线程的lambda中的调用函数

时间:2016-07-27 13:14:32

标签: c++ multithreading c++11 gcc4.8

我正在尝试创建一个可以为其构造函数赋予函数及其参数的对象。然后,该类将在lambda中调用给定函数,而lambda将传递给线程。

的内容
class worker {
public:
    template <class Fn, class... Args>
    explicit worker(Fn f, Args ... args) {
        t = std::thread([&]() -> void {
                f(args...);
        });
    }
private:
    std::thread t;
};

int main() {
    worker t([]() -> void {
        for (size_t i = 0; i < 100; i++)
            std::cout << i << std::endl;
    });

    return 0;
}

但是我收到以下错误

error: parameter packs not expanded with '...': f(args...);

我在这里做错了什么?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

正如评论中所述,使用gcc-4.9(及更高版本)编译时可以正常编译,但如果需要使用gcc-4.8,可以在worker构造函数中向lambda添加参数并通过参数传递std::thread构造函数:

class worker {
public:
    template <class Fn, class... Args>
    explicit worker(Fn f, Args ...args) {
        t = std::thread([f](Args ...largs) -> void {
                f(largs...);
        }, std::move(args)...);
    }
private:
    std::thread t;
};

这也会在lambda参数中创建参数的副本,不同于您使用[&]的引用捕获,在这种情况下可能不正确(请参阅@Yakk注释)。