我正在尝试用C ++ 11中的lambda函数实现这样的
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’
错误:需要一个类型,得到
‘{}’
错误:
‘;’
令牌之前的声明中的无效类型
有什么建议吗?
答案 0 :(得分:31)
您需要将lambda的类型作为模板参数传递,而不是lambda本身。你想要的是这个:
auto mycomp = [](const int&a, const int& b) { return a < b; };
std::map<int, int, decltype(mycomp)> test(mycomp);
虽然事实上,由于你的lambda没有捕获,它实际上可以存储在一个函数指针中,所以你也可以这样做:
std::map<int, int, bool(*)(const int&,const int&)>
test([](const int&a, const int& b) { return a < b; });
虽然我发现第一个更具可读性。虽然使用函数指针类型更通用。即它可以接受任何与该签名匹配的函数指针或非捕获lambda。但是,如果你将lambda改为捕获,它将无法工作。对于更通用的版本,您可以使用std::function
,即:
std::map<int, int, std::function<bool(const int&, const int&)>>
只要签名匹配,这将适用于任何函数,lambda(捕获或不捕获)或函数对象。