C++ 在地图中使用Lambdas

C++ 在地图中使用Lambdas,c++,c++11,lambda,C++,C++11,Lambda,我正试图在C++11中实现一个带有lambda函数的映射 std::map<int, int, [](const int&a, const int& b) { return a < b; }> test; std::map测试; 但这对我们来说是失败的 错误:'template class std::map' 错误:应为类型,获取了'{}' 错误:“;”之前的声明中的类型无效令牌 有什么建议吗?您需要将lambda的类型作为模板参数传递,而不是lambda本

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

std::map<int, int, [](const int&a, const int& b) { return a < b; }> test;
std::map测试;
但这对我们来说是失败的

错误:
'template class std::map'

错误:应为类型,获取了
'{}'

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


有什么建议吗?

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

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

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

您提供了lambda,即对象;模板参数必须是类型,而不是类型的实例。请参阅和。请注意,如果声明了两个映射,它们将具有两种不同的类型,并且不兼容。@Jesse:这将是在lambda上使用函数指针类型而不是decltype的一个参数,就像我在第二个示例中所做的那样。但是更好的方法(为了兼容性,而不是效率)是使用
std::function
,这样它甚至可以与捕获和其他函数对象的lambda兼容。请注意,
std::function
方法将比函数指针方法产生更多的开销,这是由于类型擦除…和
bool(*)(…)
raw函数指针版本可能比
decltype
版本产生间接函数调用开销,这可能是最快的版本。
std::map<int, int, bool(*)(const int&,const int&)>
    test([](const int&a, const int& b) { return a < b; });
std::map<int, int, std::function<bool(const int&, const int&)>>