2011-11-11 5 views
3

私は単純なマップstd::map<T1, std::string>を作成したいと思います。std::stringを返す関数があります。my_map[some_new_element]が呼び出され、その関数が呼び出され、その戻り値がsome_new_elementキーの値。そのようなことは可能なのですか?デフォルトのコンストラクタを `std :: map <T1, T2>`の値に設定することはできますか?

+0

確かに何らかのラッパーで可能ですが、質問は*なぜ*ですか?地図のポイントは何ですか?固定値だけが必要な場合は、関数を直接呼び出さないのはなぜですか? –

+0

関数はパラメータを受け取りますか? –

答えて

3

または値タイプまたは演算子[]をラップすることができます。

最終ラッパーが最も簡単になります。

template <typename T> 
std::string& get_default(std::map<T, std::string>& map, const T& key) { 
    auto it = map.find(key); 
    if (it == map.end()) { 
     return map[key] = create_default_value(); 
    } else { 
     return *it; 
    } 
} 

値型はどちらか、あまりにも難しいことではありません:あなたがしたいよう

struct default_string { 
    std::string wrapped_string; 
    default_string() : wrapped_string(create_default_value()) {} 
    explicit default_string(const std::string& wrapped_string) 
     : wrapped_string(wrapped_string) {} 
    operator const std::string&() const { return wrapped_string; } 
    operator std::string&() { return wrapped_string; } 
}; 

ラッピングマップは、もう少し作業がかかりますtypedefを含むインタフェース全体を複製する必要があります。注:このコードはテストされておらず、概念の証明として扱われ、あなたを正しい方向に向けることができます。

+0

+1 'get_default'関数のために、私は本当に1つの特定のコンストラクタを強制するために新しい型を作成することを本当に好きではありません... –

2

std::stringの小さなラッパークラスはどうですか?カスタムアクションを定義することができますStringWrapperのコンストラクタで

std::map<T1, StringWrapper> mymap; 

class StringWrapper { 

    StringWrapper() { //... your code 
    } 

    operator std::string&() { return m_string; } // or something like that 
private: 
    std::string m_string; 
}; 

今、あなたは、次のマップタイプを使用しています。マップにアイテムを挿入すると呼び出されます。

関連する問題