2011-06-30 4 views
2

私はSTDのサブクラス::これが正常に動作しますどのように複数のキータイプのstdマップを特化できますか?

template<class ValueT> 
FancyKeyMap 
    : public std::map<FancyKey,ValueT, FancyKey::Less> 
{ 
    ... 
public: 
    inline iterator find(FancyKeyArg key) 
    { 
     return(std::map<FancyKey,ValueT, 
       FancyKey::Less>::find(FancyKeyArg.makeKeyRef())); 
    } 
}; 

は、(私はいくつかのimplicint変換を使用したくない理由を尋ねるいけないマップを持って、これはこの場合にも、完全な変換があまりにも多くのあいまいな過負荷が発生します高価:)上記のstd ::専門マップの任意

std::map<FancyKey,ValueT> fancymap; 

と同じことを行うwoudlことができれば、とにかく

が、それは素晴らしいことですwoudl

FancyKeyMap<ValueT> fancyMap; 

このタイプのスペシャライゼーションは可能ですか?

が、それはのように振る舞うようにする "デフォルト引数は、部分的な特殊で許可されていません":私はこのエラーを取得する

namespace std { 

template<class ValT, class CompareT=FancyKey::Less, 
     class AllocT=allocator<pair<const FancyKey,ValT> > > 
    class map<FancyKey, ValT, CompareT, AllocT> 
{ 
    .... 
}; 

} 

:OK


はただ部分的な特殊化を試してみましたstd :: map "継承された"デフォルトargsを持つ必要がありますはそれらをオーバーライドすることができます。次のステップは可能ですか?

私は、非常に一般的な質問であるように見えるん検索可能なテンプレートのよくある質問を持つための提案を参照してくださいました。^>

+0

なぜあなたは 'FancyKeyMap'を持っていますか? – GManNickG

+2

C++ 0xでは、FancyKeyMap = std :: map ;を使用して 'tempate と言うことができます。 –

+2

STLコンテナを継承することは、仮想デストラクタを持たないため、一般的に悪い習慣とみなされていることをご承知おきになると思います。クラスにデータメンバーを追加しない場合は、それを取り除くことはできますが、代わりに合成を使用するのが最善の方法です。 –

答えて

0

これは(find呼び出しで)makeKeyRef()を入力して回避するために、トラブルの多くのように思えるし、より多くのこと同時に意思を明示する。余分なタイピングをして将来のメンテナーにあなたの意図を明確にすることだけを考えましたか?

また、非標準的に継承しない限り、標準コンテナは仮想デストラクタを持たないため、いつでも基本クラスポインタによって破壊されたときに未定義の動作まで開くことができます。

+0

サブクラスにはスタック引数のインラインキャストしか含まれていないので、デストラクタは問題ではありません。主な目的は、std :: mapのようにコードを記述し、適切な比較参照を選択し、キーの種類に応じてキー参照をキャストし、ヘッダーを使用して集中定義の動作を変更することですすべてのコードを変更する必要はありません)。または、同じようにキータイプを切り替える場合。私が望むのは、デフォルトの比較タイプを指定し、いくつかのメソッドをオーバーライドできるキータイプの特殊化です。 – peterk

関連する問題