Нет совпадения при вызове функции с использованием лямбда-выражений и std :: function. - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь использовать это лямбда-выражение в своем коде.И похоже, что-то не так с определением функтора или лямбды.

Я считаю, что лямбда-выражение верно.но я не могу удовлетворить прототип функции, которую я определил.

Определение функции:

    template<typename E, typename container> 
void for_each(Iterator<E,container> begin, std::function<void(E&)> fun)
{
    do // does the given unary functor to elements 
    {  //from starting iterator 'til the end.
        fun(*begin);
        begin = begin.next();
    }while(begin.hasNext());

    fun(*begin);
}

И вызывающая сторона:

  for_each(c.iterator(), [&](E& e){add(e);});

Я, кроме выполнения этого вызова функции с лямбда-выражением.Но компилятор говорит: «ошибка: нет подходящей функции для вызова ..»

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Проблемы с кодом и возможные варианты решения ниже:

1.A Lambda expression не std::function, его можно хранить только в объекте типа std::function.

Подход: (с вашей существующей подписью):

std::function<void()> f = []() -> void { // do something };
for_each(vec.begin(), vec.end(), f);

2.Лучшим решением было бы использовать Callable в качестве параметра (Перейти к концу ответа).

3.Если вы хотите использовать свою собственную версию for_each, почему бы не следовать реализации, которая совместима с другими алгоритмами или, в этом отношении, с реализацией for_each в заголовке алгоритма.

Имеет все, что вы хотите, а также в соответствии с другими стандартными алгоритмами: ru.cppreference.com /gorithms / for_each :

    template<class InputIt, class UnaryFunction>
    constexpr UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
    {
      for (; first != last; ++first) {
        f(*first);
      }
      return f;
    }
0 голосов
/ 29 декабря 2018

лямбда не является std::function, поэтому вывод не выполняется.

Вы можете просто передать универсальный Functor:

template<typename E, typename container, typename F> 
void for_each(Iterator<E, container> begin, F&& fun)
{
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...