Задать вопрос
Dyikot
@Dyikot

Почему нельзя использовать std::function как аргумет шаблонной функции?

Есть такая функция.
template <typename T>
void Sort(std::vector<T>& vector, std::function<bool(T, T)> comparison);

Проверяю
std::vector<int> vec = { 1, 2, 3, 4, 5, 7, 6, 9 ,8 };

	Sort(vec, [](int left, int right)
	{
		return left < right;
	});

и получаю ошибки:
6555ef699587f264016829.png
  • Вопрос задан
  • 153 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Потому что лямбда не ялвяется std::function. Компилятор, вообще говоря, может лямбду привести к типу std::function, но не в вашем случае. Вам надо, например, самим преобразовать лямбду в std::function:
std::function<bool(int, int)> comp = [](int left, int right)
  {
    return left < right;
  };
  Sort(vec, comp);


Сам компилятор тут это сделать не может, потому что ему тип к которму приводить-то неизвестен - он зависит от параметра шаблона T.

Можно, еще, например, указать компилятору параметры шаблона, тогда все скомпилируется:
Sort<int>(vec, [](int left, int right)
  {
    return left < right;
  });


Но лучший вариант - не использовать std::function в шаблоне. Просто используйте какой-то typename U, у которого вы продполагаете существует operator(int, int). Если туда передать не function и не лябмду, оно не скомпилится:

template <typename T, typename U>
void Sort(std::vector<T>& vector, U comparison) {
    // Используете comparison, как-будто это std::function:
    if (comparison(1, 1)) return;
};


int main()
{
  std::vector<int> vec = { 1, 2, 3, 4, 5, 7, 6, 9 ,8 };

  Sort(vec, [](int left, int right) -> bool
  {
    return left < right;
  });
    return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dima20155
you don't choose c++. It chooses you
Потому что lambda != std::functional
Пример:
https://godbolt.org/z/YrKc8q5q7

https://stackoverflow.com/questions/11774277/lambd....
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы