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()”起作用。

感谢阅读。

如果您的 ReturnTypevoid,您的 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();