我正在尝试在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(捕获或不捕获)或函数对象.