假设我有一个包含成员变量的类:
std::unordered_map<KeyType, std::shared_ptr<ValueType>> myMap
在成员函数中我想执行以下操作:
std::for_each(myMap.begin(), myMap.end(), [](std::pair<const KeyType, std::shared_ptr<ValueType>>& pair){pair.second->someMethod(); });
有没有缩短lambda表达式?我以为我可以做到这一点,但它不是有效的语法:
std::for_each(myMap.begin(), myMap.end(), [](decltype(myMap::valueType)& pair){pair.second->someMethod(); });
答案 0 :(得分:9)
我根本不打扰lambda。与其他标准算法不同,for_each()
不比同等for
更具表现力或可读性。
for (auto& p : myMap)
p.second->someMethod();
for (auto p = myMap.begin(); p != myMap.end(); ++p)
p->second->someMethod();
答案 1 :(得分:5)
我推荐typedef
复合模板,例如assoc容器,因此您可以执行以下操作:
typedef std::unordered_map<KeyType, std::shared_ptr<ValueType>> map_type;
map_type myMap;
//do with map
std::for_each(myMap.begin(), myMap.end(),
[](typename map_type::value_type& pair){
pair.second->someMethod();
});
或没有typedef
std::for_each(myMap.begin(), myMap.end(),
[](typename decltype(myMap)::value_type& pair){
pair.second->someMethod();
});
decltype获取对象的类型,您需要使用模板化类中定义的typename,为此,您使用typename
关键字。如果模板特化没有那个typedef,这是必要的。
答案 2 :(得分:0)
我做了一个像这样的宏: //来自容器名称的匿名lambda类型扣除
#define _A(container)\
std::remove_reference<decltype(*std::begin(container))>::type
在您的情况下,请使用:
std::for_each(myMap.begin(), myMap.end(), [](_A(myMap)& pair) {
pair.second->someMethod();
});
注意:的
如果键入remove_reference
,则需要[](const _A(myMap)& pair)
来保留常量,否则&
会删除const
声明。