74

C++ 0x にはテンプレート エイリアスがあります (テンプレート typedef と呼ばれることもあります)。ここを参照してください。C++ の現在の仕様にはありません。

回避策として何を使用しますか? コンテナ オブジェクトまたはマクロ ? その価値はありますか?

4

3 に答える 3

104

回避策として何を使用しますか? コンテナ オブジェクトまたはマクロ ? その価値はありますか?

標準的な方法は、次のようにメタ関数を使用することです。

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% の確率で最良の代替手段です。ここでマクロを使用しても、多くの欠点があります。

(編集: ダニエルがコメントで指摘したように、Boost/STL 規則を反映するようにコードを修正しました。)

于 2008-08-25T14:51:01.920 に答える
12
template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};

仮想デストラクタを持たないクラスから継承するべきではありません。これは、派生クラスのデストラクタが必要なときに呼び出されないことに関連しており、未割り当てのメモリが発生する可能性があります。

派生型にこれ以上データを追加していないため、*****おそらく*****上記のインスタンスでそれを回避できると言われています。これは推奨ではないことに注意してください。私はまだあなたがそれをしないことをお勧めします。できるからといって、そうすべきだというわけではありませ

編集: はい、これは ShaChris23 の投稿への返信です。彼/彼女のメッセージの下ではなく上に表示されたため、おそらく何かを見逃していました。

于 2010-01-18T23:01:11.320 に答える
0

場合によっては、必要なすべての型のテンプレート化されていない typedef を明示的に書き出すことができます。基本クラスが複数のテンプレート引数でテンプレート化され、typedef が必要な型が 1 つだけの場合、継承されたクラス名に typedef が効果的に含まれる特殊なクラスを継承できます。このアプローチは、メタ関数アプローチよりも難解ではありません。

于 2013-03-19T00:31:33.683 に答える