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

时间:2018-08-28 03:55:20

标签: c++ c++17

我正在尝试实现风味的for_each(),当传入的函数返回false时,它将停止迭代。如果传入的函数未返回布尔值,则以std::for_each()的身份运行。

获取返回的函数参数类型有些困难,我尝试使用std::invoke_result_t,但它抱怨:

  

在'std :: __ 1 :: invoke_result <...

中没有名为'type'的成员

在C ++参考上的example中,该函数始终以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);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

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

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