c++线程池std::promise和函数类型错误
Posted
技术标签:
【中文标题】c++线程池std::promise和函数类型错误【英文标题】:c++ Thread pool std::promise and function type error 【发布时间】:2021-11-13 18:27:51 【问题描述】:我尝试编写自己的线程池版本,但行数有问题
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()”工作。
感谢阅读。
【问题讨论】:
【参考方案1】:如果您的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();
【讨论】:
以上是关于c++线程池std::promise和函数类型错误的主要内容,如果未能解决你的问题,请参考以下文章
c++ 中的 std::promise 和 std::future
C++ std::future与promise(异步回调异步调用)
C++ std::future与promise(异步回调异步调用)