我正在尝试创建一个对象,可以为它的构造函数提供一个函数及其参数。然后,此类将在 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...);
我在这里做错了什么?任何帮助,将不胜感激。
正如评论中所述,可以使用 gcc-4.9 (及更高版本)编译,但如果您需要使用 gcc-4.8,您可以将参数添加到 lambdaworker
构造函数并通过传递参数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 评论)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)