在地图中使用Lambdas

ygr*_*ygr 26 c++ lambda c++11

我正在尝试在C++ 11中实现一个带有lambda函数的映射

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

但那失败了

错误:模板参数列表中参数3的类型/值不匹配 ‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’

错误:期望一个类型,得到 ‘{}’

错误:‘;’令牌之前的声明中的无效类型

有什么建议?

Ben*_*ley 38

您需要传递lambda的类型作为模板参数,而不是lambda本身.你想要的是这个:

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

虽然实际上,由于你的lambda没有捕获,它实际上可以存储在一个函数指针中,所以或者,你可以这样做:

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

虽然我发现第一个更具可读性.虽然使用函数指针类型更通用.即它可以接受任何与该签名匹配的函数指针或非捕获lambda.但是,如果你将lambda改为捕获,它将无法工作.对于更通用的版本,您可以使用std::function,即:

std::map<int, int, std::function<bool(const int&, const int&)>>
Run Code Online (Sandbox Code Playgroud)

只要签名匹配,这将适用于任何函数,lambda(捕获或不捕获)或函数对象.

  • ...而`bool(*)(...)`原始函数指针版本可能会导致`decltype`版本的间接函数调用开销,这可能是最快的. (2认同)