Использование Lambdas в Картах - PullRequest
22 голосов
/ 05 января 2012

Я пытаюсь реализовать карту с лямбда-функцией в C ++ 11 как таковую

std::map<int, int, [](const int&a, const int& b) { return a < b; }> test;

, но это не удается с

ошибка: несоответствие типа / значенияв аргументе 3 в списке параметров шаблона для ‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’

ошибка: ожидается тип, получено ‘{}’

ошибка: недопустимый тип в объявлении до ‘;’ токен

Любой совет?

1 Ответ

32 голосов
/ 05 января 2012

Вам нужно передать тип лямбды в качестве аргумента шаблона, а не саму лямбду.То, что вы хотите, это:

auto mycomp = [](const int&a, const int& b) { return a < b; };
std::map<int, int, decltype(mycomp)> test(mycomp);

Хотя на самом деле, поскольку ваша лямбда не имеет перехватов, она на самом деле может быть сохранена в указателе функции, поэтому в качестве альтернативы вы можете сделать это:

Хотя я нахожу первое гораздо более читабельным.Хотя использование указателя на функцию типа является более универсальным.т.е. он может принимать любой указатель на функцию или лямбда без захвата, соответствующую этой сигнатуре.Но если вы измените свою лямбду для захвата, она не будет работать.Для более универсальной версии вы можете использовать std::function, то есть:

std::map<int, int, std::function<bool(const int&, const int&)>>

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

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