質問

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 が効果的に含まれる特殊なクラスを継承できます。このアプローチは、メタ関数アプローチよりも難解ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top