c++线程池std::promise和函数类型错误
c++ Thread pool std::promise and function type error
我尝试编写自己的线程池版本,但在行方面遇到困难
template <typename F, typename...Args>
auto addWork(F&& f, Args&&... args) -> std::future<decltype (f(args...))>
{
using ReturnType = decltype(f(args...));
//...
result.set_value(f(args...));
std::promise<ReturnType> result;
result.set_value(f(args...));
return result.get_future();
//...
除了 f 没有参数或为 void 类型时,一切似乎都正常。我不知道如何使“set_value()”起作用。
感谢阅读。
如果您的 ReturnType
是 void
,您的 std::promise<ReturnType> result
变量是一个特化 - std::promise<void>
。它的 set_value
(4) 方法不接受任何参数。
要解决此问题,您可以使用 if constexpr
检查您是否正在处理涉及函数返回 void
的特殊情况。只需更改此:
std::promise<ReturnType> result;
result.set_value(f(args...));
return result.get_future();
对此:
std::promise<ReturnType> result;
if constexpr (std::is_same_v<ReturnType, void>) {
f(args...);
result.set_value();
} else {
result.set_value(f(args...));
}
return result.get_future();
我尝试编写自己的线程池版本,但在行方面遇到困难
template <typename F, typename...Args>
auto addWork(F&& f, Args&&... args) -> std::future<decltype (f(args...))>
{
using ReturnType = decltype(f(args...));
//...
result.set_value(f(args...));
std::promise<ReturnType> result;
result.set_value(f(args...));
return result.get_future();
//...
除了 f 没有参数或为 void 类型时,一切似乎都正常。我不知道如何使“set_value()”起作用。
感谢阅读。
如果您的 ReturnType
是 void
,您的 std::promise<ReturnType> result
变量是一个特化 - std::promise<void>
。它的 set_value
(4) 方法不接受任何参数。
要解决此问题,您可以使用 if constexpr
检查您是否正在处理涉及函数返回 void
的特殊情况。只需更改此:
std::promise<ReturnType> result;
result.set_value(f(args...));
return result.get_future();
对此:
std::promise<ReturnType> result;
if constexpr (std::is_same_v<ReturnType, void>) {
f(args...);
result.set_value();
} else {
result.set_value(f(args...));
}
return result.get_future();