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

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

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

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

error: type/value mismatch at argument 3 in template parameter list for 'template class std: :map'

error: expected a type, received '{}'

error: invalid type in declaration before ';' token

Any advice?

26
задан ildjarn 5 January 2012 в 02:55
поделиться

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, то есть:

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

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

38
ответ дан 28 November 2019 в 07:31
поделиться
Другие вопросы по тегам:

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