2017-03-24 17 views
0

myself--を繰り返すことにして#defineに頼る必要がなく削減するために - 私は、次のような何かしたいと思います。一方でC++クラス宣言でクラス名をテンプレート化することは可能ですか?

template <class T> 
class T final: public Base 
{ 
public: 
    T(); 
    virtual ~T(); 

private: 
    void method1(T const& that); 
    const T* method2(char const*); // was pure-virtual in Base 
}; 

を、私はこれがあるため禁止されて怖いですよテンプレート上で、それを呼び出すために、独自の名前がありません:

typedef ???<DerivedFOO> DerivedFOO; 

が、一方で、私はので、多分このことISNを行うにはいくつかの方法があり、C++テンプレートは自身チューリング完全言語であることを理解あまりにもひどく畳み込まれていない?それが最も説得力のある答えなってしまう場合

#defineを使用すると、あなたのニーズを達成するために、少なくとも、難読化の方法です」と答える
  • は私に受け入れられるだろう。

  • 私は現在C++ 11に固執しています。しかし、言語の新しい反復回数に依存答えはまだ受け入れられる(私は自分のニーズは何か他のものを必要としていても、一般の聴衆のために最善と思われる答えを受け付けます。)

+0

?プログラミング言語では、名前には何があるのですか?変数、クラスなどの名前を一貫して変更しても、プログラムの実行方法には影響しません。もちろん、あなたは反射を使用していない限り。しかし、C++にはほとんど反映されていません。だから私は目的を見ていない。たぶん、反復が実際に発生するコードを追加した場合、より明確になりますか?繰り返しは問題だと主張しますが、私はどのように正確に見えません。 –

+0

@NirFriedmanに同意するつもりです。問題は曖昧です。あなたが達成しようとしていることをかなり理解していない。 – dwwork

+0

公正な質問。私はすべて同じインターフェースを持ちますが、実装が異なる3つのクラスを持っています。コンパイラがそれらを異なる型であると考えるようにしたい。私は本質的に私のヘッダーファイルで3回同じクラス宣言をすることを避けたい。 (ちょうどそれをDRYにしておきます。)dwworkの答えが出るまで、テンプレートをパラメータ化する唯一の変種は、派生クラスの名前でした。しかし、私のメソッドの1つはType()で、それぞれ異なるDerivedFOOに固有の列挙値を返すことが分かりました。私の解決策があるかもしれません。 –

答えて

1

は何を達成するのこの種をいあなたは欲しいですか?

enum NAMES 
{ 
    NAME1, 
    NAME2, 
    .... 
}; 

template<int Name> 
class Derived : public Base 
{ 
... 
}; 

として使用されるでしょう:なぜあなたはこれを行うにはしたくない:私は聞いている

Derived<NAME1> a; 
+0

私の実際のクラス(上記の例ではない)はenumクラスの値に強く関連しているので、興味深い考えです。私はそのアイデアを後で演奏します。 –

+0

私はあなたがまだ各クラスを個別に(テンプレートの専門分野として)実装しなければならないと言っています。しかし、もしあなたが何らかの理由で(ヘルパー構造体や他のメタテンプレートテクニックを使って)enum上のクラスの振る舞いを基にすることができれば、コードの行を節約することができます。 – dwwork

+1

私はこの解決策が大好きではありませんが、もしあなたがこのように行くなら、少なくとも列挙型テンプレート自体のテンプレート 'テンプレート'。それを 'enum class 'にする。そうすれば、 'Derived <0> a'を実行することはできません。また、名前はスコープを使って明確になります。「Derived a; –

関連する問題