传递给线程的 lambda 中的调用函数
Call function inside a lambda passed to a thread
我正在尝试创建一个可以为其构造函数提供函数及其参数的对象。这个 class 然后将调用一个 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,则可以将参数添加到 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 评论)。
我正在尝试创建一个可以为其构造函数提供函数及其参数的对象。这个 class 然后将调用一个 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,则可以将参数添加到 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 评论)。