2011-12-08 3 views
2

私はいくつかのコンストラクタを持つクラスを持っています。 argvを介してmain()に渡されるパラメータによれば、私は異なるコンストラクタを切り替える必要があります。次の単純化された例は、「obj」がclassに変更され、 obj1-> intおよびobj2-> doubleです。しかし、enumを使って次のコードを実行するためには、何を変更する必要がありますか?コンストラクタテンプレート

#include<iostream> 

using namespace std; 

enum obj{obj1,obj2}; 

template <obj T> 
class A 
{ 
public: 
    A(T); 

private: 
    T t_; 
}; 

template<obj T> 
A<T>::A(T) 
{} 

template<> 
A<obj1>::A(obj1 t):t_(t) {cout<<"case 1"<< endl;} 

template<> 
A<obj2>::A(obj2 t):t_(t) {cout<<"case 2"<< endl;} 

int main() 
{ 
    obj test=obj1; 
    A<obj> a(test); 
    return 1; 
} 

ありがとうございました!

編集:型/値に関してコードが間違っていることは明らかですが、どのようなメカニズムがコンストラクタの切り替えに似ていますか?

+3

これは意味をなさない。 'obj1'と' obj2'はenum * values *ですが、それらを* types *として使用しようとしています。 –

+1

テンプレートは、** enum値**を指定する必要があることを意味します。 'A 'は値ではないのでコンパイルされません。これは型です。 –

答えて

1

私は次のようにあなたがすることを意図するものであると思う:

#include<iostream> 

enum obj{obj1,obj2}; 

template<obj> 
class A 
{ 
public: 
    A(); 

private: 
    obj t_; 
}; 

template<obj x> 
A<x>::A() : t_(x){} 

template<> 
A<obj1>::A() : t_(obj1){ std::cout << "obj1\n"; } 

template<> 
A<obj2>::A() : t_(obj2){ std::cout << "obj1\n"; } 

int main() 
{ 
    const obj x = obj1; // can only be used as the template argument below because it's a compile time constant 
    A<x> a; 

    return 0; 
} 

しかし、あなたが一定のコンパイル時に「スイッチ」にしたい場合にのみ動作し、あなたがいないように聞こえます。実行時条件(if,など)を使用する必要があります。

+0

今私は問題を参照してください、私はconstの周りを得ることができない、多くのありがとう! –

3

値ではなくタイプに特化する必要があります。コンパイル時に値が分かっている場合は、boost::mpl::int_を使用します。あなたが(あなたの場合のように)しなければ、普通の古いifと一緒に生きなければならないでしょう。あなたは問題が間違って近づいている

enum E 
{ 
    A, 
    B 
}; 

template<E e> 
struct A 
{ 
}; 

template<> 
struct A<E::A> 
{ 
}; 

template<> 
struct A<E::B> 
{ 
}; 

int main() 
{ 
    A<E::B> ab; 
} 
+0

boost :: mpl :: int_に関するヒントは非常に役に立ちます、ありがとうございます! –

0

あなたはこのような何かをしなければなりません。テンプレートはコンパイル時にインスタンス化されるため、実行時に存在する値に基づいて特殊化を選択することはできません。コード内の他の間違いを除いて、この解決法は機能しません。

この種の問題(パラメータに基づいて異なるオブジェクトを作成する)に対する共通の解決策は、abstract factory patternです。これは、条件付き構築ロジックをファクトリクラスに移動し、仮想メソッドを使用して呼び出し側に異なるコードを書く必要を避けることを意味します(本質的に多態性を利用します)。

1

+0

私の上位コードの修正は次のようになります。しかし、パラメータリストは等しくなければなりません。 #include using namespace std; enum obj_type {obj1、obj2}; テンプレート struct obj { }; テンプレートクラス {パブリック: A(INT、INT)。 プライベート: int a_; \t int b_; \t obj_type型。 }; テンプレート<> > ::(INT A、INT B):A_(a)は、B_(B) {COUT << "ケース1" << ENDL。 this-> type = obj1; } テンプレート<> > ::(INT A、INT B):A_(A) {B_ = 0。 cout << "case 2" << endl; this-> type = obj2; } メインINT(){ >(1,2)。 リターン1; } –

+0

申し訳ありません私はそれを解読しません。オンラインコード貼り付け(pastebin.com)を使用しますか? –

+0

http://pastebin.com/n90uFDFn –