如何使用 std::invoke_result_t 获取函数的返回类型

Lei*_*Hua 3 c++ c++17

我正在尝试实现一个风味的for_each(),当传入的函数返回时它将停止迭代false。如果传入的函数没有返回布尔值,则作为std::for_each().

我在获取函数参数的返回类型时遇到了一些困难,我尝试使用std::invoke_result_t,但它抱怨:

“std::__1::invoke_result<...”中没有名为“type”的成员

在C++ 参考示例中,它总是传入Arg函数的类型。但就我而言,类型不应该F已经包含整个函数的所有类型信息吗?

template<class C, class F>
void for_each(C container, F&& f)
{
    for (auto const& v : container)
    {
        if constexpr (std::is_same_v<std::invoke_result_t<F>, bool>)
        {
            if (not std::forward<F>(f)(v))
                break;
        }
        else
        {
            std::forward<F>(f)(v);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*qua 5

“如何使其工作”问题的第一部分的答案是包含参数类型 - 在这种情况下,可能类似于std::invoke_result_t<F, decltype(v)>.

至于“F类型不应该已经包含了整个函数的所有类型信息吗?” - 正如另一位评论者所提到的,可能F是一个具有多个operator()重载的函数对象,所以答案是否定的。