5

メンバー変数を持つクラスがあるとしましょう:

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

ラムダ式を短縮する方法はありますか? 私はこれを行うことができると思っていましたが、有効な構文ではありませんでした:

std::for_each(myMap.begin(), myMap.end(), [](decltype(myMap::valueType)& pair){pair.second->someMethod(); });
4

3 に答える 3

5

assoc コンテナーのような複雑なテンプレートをお勧めtypedefします。このため、次のようなことができます。

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 がない場合に必要です。

于 2012-04-28T17:53:00.853 に答える