Подтвердить что ты не робот

Использование Лямбда в картах

Я пытаюсь реализовать карту с лямбда-функцией в С++ 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’

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

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

Любые советы?

4b9b3361

Ответ 1

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

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

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

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

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

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

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