可以简化这个表达式吗?

gri*_*ett 5 c++ stl c++11

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

std::unordered_map<KeyType, std::shared_ptr<ValueType>> myMap
Run Code Online (Sandbox Code Playgroud)

在一个成员函数中,我想做以下事情:

std::for_each(myMap.begin(), myMap.end(), [](std::pair<const KeyType, std::shared_ptr<ValueType>>& pair){pair.second->someMethod(); });
Run Code Online (Sandbox Code Playgroud)

无论如何缩短lambda表达式?我以为我可以这样做,但它不是有效的语法:

std::for_each(myMap.begin(), myMap.end(), [](decltype(myMap::valueType)& pair){pair.second->someMethod(); });
Run Code Online (Sandbox Code Playgroud)

Jon*_*rdy 9

我根本不会打扰一个lambda.与其他标准算法不同,for_each()它不比等效的更具表现力或可读性for.

for (auto& p : myMap)
    p.second->someMethod();

for (auto p = myMap.begin(); p != myMap.end(); ++p)
    p->second->someMethod();
Run Code Online (Sandbox Code Playgroud)


111*_*111 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(); 
});
Run Code Online (Sandbox Code Playgroud)

或没有typedef

std::for_each(myMap.begin(), myMap.end(), 
    [](typename decltype(myMap)::value_type& pair){
        pair.second->someMethod(); 
});
Run Code Online (Sandbox Code Playgroud)

decltype获取对象的类型,您需要使用模板化类中定义的typename,为此,您可以使用typename关键字.如果模板专门化没有该typedef,则这是必需的.