可以简化这个表达式吗?

时间:2012-04-28 17:50:15

标签: c++ stl c++11

假设我有一个包含成员变量的类:

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(); });

3 个答案:

答案 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声明。