Я пытаюсь реализовать ароматизированный for_each()
, итерация прекратится, когда переданная функция вернет false
. Если переданная функция не возвращает логическое значение, выполните ее как std::for_each()
.
У меня возникли трудности с получением возвращаемого типа параметра функции, я пытался использовать std::invoke_result_t
, но он жалуется:
нет члена с именем 'type' в 'std :: __ 1 :: invoke_result <... </p>
В примере на 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);
}
}
}