首页 > 解决方案 > 如何使用 std::invoke_result_t 获取函数的返回类型

问题描述

我正在尝试实现一个有味道的for_each(),它会在传入的函数返回时停止迭代false。如果传入的函数没有返回布尔值,则运行 as std::for_each()

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

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

在C++ 参考的示例Arg中,它总是传入函数的类型。但就我而言, type 不应该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);
        }
    }
}

标签: c++c++17

解决方案


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

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


推荐阅读