私は単純なマップstd::map<T1, std::string>
を作成したいと思います。std::string
を返す関数があります。my_map[some_new_element]
が呼び出され、その関数が呼び出され、その戻り値がsome_new_element
キーの値。そのようなことは可能なのですか?デフォルトのコンストラクタを `std :: map <T1, T2>`の値に設定することはできますか?
3
A
答えて
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;
};
今、あなたは、次のマップタイプを使用しています。マップにアイテムを挿入すると呼び出されます。
関連する問題
- 1. はSTDに値を設定することはできません::マップ<はstd ::文字列、のstd :: shared_ptrの<class>>
- 2. std :: vectorから要素を移動する<T1>からstd :: vector <std :: pair <T1,T2>>
- 3. std :: map <t1, t2> :: erase(イテレータの位置)の作業?
- 4. イテレータのコンストラクタでデフォルト値を設定する方法は? C++
- 5. CordovaアプリケーションのLocalStorageにデフォルト値を設定することはできますか?
- 6. デフォルトのコンストラクタでランダムな値を設定する
- 7. std :: map <string,int>デフォルトの初期化値
- 8. std :: mapをrvalueとして作成することはできますか?
- 9. 私は自分のpiecewise_constructコンストラクタを作ることができますか?ここ
- 10. 私はstd :: map :: operator []に触れることができますか?
- 11. C#クラスのプロパティを常に特定のデフォルト値に設定することはできますか?
- 12. RubyのMatchDataのデフォルト値を設定できますか?
- 13. コンストラクタなしで派生クラスのデフォルト値を設定することは可能ですか?
- 14. std :: functionのデフォルト値を指定する
- 15. Wit.aiでデフォルトのインテントを設定することはできますか?
- 16. なぜstd :: functionインスタンスにデフォルトのコンストラクタがあるのですか?
- 17. コンストラクタの値をあるクラスから渡してデフォルトのコンストラクタに値を設定する方法
- 18. タイプ<T1>のオブジェクトから<T>のオブジェクトを作成するコンストラクタ
- 19. タプルはどうですか<T1,T2>。<T1,T2>(T1アイテム1、T2アイテム2)を作成しますか?
- 20. <include/>デフォルトのXML値に設定
- 21. プロパティのコンストラクタはコンストラクタでのみ設定できますが、どこからでも取得できますか?
- 22. SAPUI5 - デフォルトの選択リストキーを設定することはできますか?
- 23. NHibernateでプロパティにデフォルト値を設定することは可能ですか
- 24. DBNullのときにDataTableのオブジェクトにデフォルト値を設定する
- 25. Doxygenがstd :: shared_ptrまたはstd :: mapを認識できるか
- 26. デフォルト値としてドロップダウンで値= 1の項目を設定できますか?
- 27. property_tree:デフォルトのプロパティ値を設定できませんか?
- 28. construutureでデフォルトのパラメータ値を設定できますか?
- 29. DynamicControlに表示するデフォルト値を設定することはできますか? Not
- 30. mapキー/値が変更されないと、std :: map iteratorの出力順序は一定になりますか?
確かに何らかのラッパーで可能ですが、質問は*なぜ*ですか?地図のポイントは何ですか?固定値だけが必要な場合は、関数を直接呼び出さないのはなぜですか? –
関数はパラメータを受け取りますか? –