テンプレート typedef - 回避策は何ですか?
-
09-06-2019 - |
質問
C++ 0x にはテンプレート エイリアス (テンプレート typedef と呼ばれることもあります) があります。見る ここ. 。C++ の現在の仕様ではそうではありません。
回避策として何を使用したいですか?コンテナオブジェクトまたはマクロ?それに価値があると感じますか?
解決
回避策として何を使用したいですか?コンテナオブジェクトまたはマクロ?それに価値があると感じますか?
標準的な方法は、次のようにメタ関数を使用することです。
template <typename T>
struct my_string_map {
typedef std::map<std::string, T> type;
};
// Invoke:
my_string_map<int>::type my_str_int_map;
これは STL でも使用されます (allocator::rebind<U>
) および Boost を含む多くのライブラリにあります。私たちはそれを広く使用しています バイオインフォマティクスライブラリ.
膨大ではありますが、99% の場合、これが最良の代替手段です。ここでマクロを使用することには、多くの欠点があるため、価値がありません。
(編集:Daniel がコメントで指摘したように、Boost/STL 規約を反映するようにコードを修正しました。)
他のヒント
template <typename T> struct my_string_map : public std::map<std::string,T> { };
仮想デストラクターを持たないクラスからは継承しないでください。これは、派生クラスのデストラクターが呼び出されるべきときに呼び出されないことに関連しており、メモリが割り当てられていない状態になる可能性があります。
そうは言っても、上記のインスタンスでは、派生型にデータを追加していないため、****おそらく***** この問題を回避できます。これは推奨するものではないことに注意してください。それでもアドバイスします しないでください やれ。あなたが できる それはあなたの意味ではありませんか すべき.
編集:はい、これは ShaChris23 の投稿への返信です。おそらくメッセージの下ではなく上に表示されたため、何かを見逃してしまったのでしょう。
場合によっては、必要なすべての型のテンプレート化されていない typedef を明示的に書き出すことができます。基本クラスが、typedef が必要な 1 つの型だけを持つ複数のテンプレート引数でテンプレート化されている場合、継承されたクラス名に typedef が効果的に含まれる特殊なクラスを継承できます。このアプローチは、メタ関数アプローチよりも難解ではありません。