2013-03-01 3 views
5

格納場所を選択するオプションを含むコンテナを実装するクラステンプレートを考えてみましょう。それは唯一のクラスで使用されているのでここでクラステンプレートの列挙型にアクセスするためのテンプレートパラメータの繰り返しを避ける

template<class T> 
class Container { 
public: 
    enum StorageOption {A,B}; 
    Container(StorageOption opt_): option(opt_) {} 
private: 
    StorageOption option; 
}; 

StorageOptionがメンバーであるように選択されました。今

、私は次のように、テンプレートパラメータを繰り返す必要がありますクラスインスタンス化する:

{ 
    Container<int> c(Container<int>::A); 
} 

してパラメータを繰り返さないようにする方法はありますし、同時にメンバーであるStorageOptionを持っているか、そこにありますオプションを実装するより良い方法は?

+0

hmjdのアイデアがうまくいくかどうかわかりません。 –

+0

これは 'type = Container :: StorageOption'を使って試しましたか? –

+0

クラスから列挙型を取り出し、それを 'ContainerStorageOption'という名前の醜い解決策があります。 –

答えて

7

通常、基本クラスで定義することで実現します。

class ContainerBase { 
public: 
    enum StorageOption {A,B}; 
}; 


template<class T> 
class Container : public ContainerBase{ 
public: 
    Container(StorageOption opt_): option(opt_) {} 
private: 
    StorageOption option; 
}; 

Container<int> c(ContainerBase::A); 
+0

右私はいつもこの多型がハンマーであるほど小さいものを考えています。しかし、私はそれがC++がどういう意味かと思います。 – ritter

+0

@Frank、多型はなく、 'ContainerBase'はポリモーフィックではありません –

+0

もう一度。それは唯一の構成です。いい視点ね! – ritter

0

私は自分自身と私は本当にあなたが列挙型クラスを使用したい時に、基本クラス指定子を繰り返す必要がどのように、基本クラスの必要性だけでなく、好きではない。この問題で戦ってきました。

namespace FuncEnum{ 
    enum class FuncNeighbor{ 
     FLOOR, CEILING, SELF 
    }; 
    enum class FuncDirection{ 
     BACK, FRONT, BACKNFRONT 
    }; 
    enum class FuncVar{ 
     X, Y 
    }; 
} using namespace FuncEnum; 

template<typename... Types> 
class Func {}; 

このようにして、最小限の仕様でグローバルに利用できるenumクラスを作成できます。 <クラスニックネーム> < enumクラス名>の間で衝突が発生する可能性は低いですが、たとえあったとしても、使用する宣言は、どのグローバル識別子が干渉しても構いません(特有のケースでは、宣言)。

関連する問題