Как использовать std :: invoke_result_t для получения возвращаемого типа функции - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь реализовать ароматизированный 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);
        }
    }
}

1 Ответ

0 голосов
/ 28 августа 2018

Ответ на первую часть вопроса «как заставить это работать» состоит в том, чтобы включить тип (ы) аргументов - в этом случае, вероятно, что-то вроде std::invoke_result_t<F, decltype(v)>.

Что касается "не должен ли тип F уже содержать всю информацию о типе всей функции?" - как упомянул другой комментатор, F может быть функциональным объектом с множественными перегрузками operator(), поэтому ответ - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...