我正在尝试实现风味的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);
}
}
}
答案 0 :(得分:3)
“如何使其工作”问题的第一部分的答案是包括自变量类型-在这种情况下,可能类似于std::invoke_result_t<F, decltype(v)>
。
至于“类型F是否应该已经包含整个函数的所有类型信息?” -正如另一位评论者所提到的,F
可能是具有多个operator()
重载的函数对象,因此答案是否定的。