我正在尝试在C++11中实现一个带有lambda函数的映射
std::map<int, int, [](const int&a, const int& b) { return a < b; }> test;
但这失败了,因为
错误:
‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’
的模板参数列表中参数%3处的类型/值不匹配
错误:应为类型,但已获取‘{}’
错误:‘;’
标记前的声明中的类型无效
有什么建议吗?
发布于 2012-01-05 11:11:23
您需要将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更改为捕获,它将不起作用。对于更多功能的版本,您可以使用std::function
,即:
std::map<int, int, std::function<bool(const int&, const int&)>>
这将适用于任何函数,lambda(捕获与否)或函数对象,只要签名匹配即可。
https://stackoverflow.com/questions/8736997
复制相似问题