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

标签 c++ c++17

我正在尝试实现一个有 flavor 的 for_each(),当传入的函数返回 false 时它将停止迭代。如果传入的函数不返回 bool 值,则作为 std::for_each() 运行。

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

no member named 'type' in 'std::__1::invoke_result<...

example在 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);
        }
    }
}

最佳答案

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

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

关于c++ - 如何使用 std::invoke_result_t 获取函数的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52049841/

相关文章:

C++11 构造函数中的隐式实例

c++ - 绘制 QGraphicsItem 的边框

c++ - 在 Boost zip 迭代器上使用 C++17 并行执行算法时,为什么会出现 MSVC 错误?

c++ - 所有 constexpr 变量都隐式内联吗?

c++ - 为什么 lambda 比 std::function 慢?

c++ - 如何正确声明模板类的嵌套类的友元?

c++ - 通过引用访问 const 的语法

c++ - std::lock_guard 还是 std::scoped_lock?

c++ - 在不同平台上通过管道传输数据的最佳和安全方式

c++ - 简化存储在类的 std::vector 成员中的 std::function 的使用