c++ - 如何使用 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);
}
}
}
解决方案
“如何使其工作”问题的第一部分的答案是包含参数类型 - 在这种情况下,可能类似于std::invoke_result_t<F, decltype(v)>
.
至于“类型F不应该已经包含了整个函数的所有类型信息吗?” - 正如另一位评论者提到的,它可能F
是一个具有多个operator()
重载的函数对象,所以答案是否定的。
推荐阅读
- c# - 将 DataTable 绑定到 DataGrid
- laravel - 如何在不循环每个项目的情况下循环收集?
- java - 我如何在 for 循环中使用 TestNg 断言方法
- php - PHP Laravel将数据合并到单个数组
- xslt-1.0 - 这个xpath可以简化吗?
- c++ - 查找数组中信号幅度(最大值)的函数和指针
- jupyter-notebook - 如何在 nbconvert 库中配置工作目录
- javascript - 如何通过 jquery 监听器访问 javascript 原型方法?
- android - 如何在android中获取当前设备语言?
- file-upload - 将 UploadedFile (primefaces) 转换为 FileObject (Apache Common)