2017-10-16 11 views
1

テンプレート引数としてインスタンス化できるクラステンプレートを作成する方法はありますか?自分自身で作成したクラスを引数として取るクラステンプレートを作成する

私は私のコードでは、この何かを言うことができるようにしたいと思います:

Operation<float> op1(0.3f); 
Operation<float, Operation> op2(0.5f, op1); 

私は無限ループで終わる避けるために、可変引数テンプレートパラメータを持つようなクラスのテンプレートを定義しようとした(テンプレートを持っているでしょうテンプレートパラメータをとるテンプレートテンプレートパラメータを定義します。テンプレートパラメータ自体もテンプレートパラメータをとる必要があります。

template<typename T, typename... OP> 
class Operation{ 
    Operation(T pVal, OP... pOP); 
    ... 
}; 

typename... OPOperation<T>あるいはOperation<T, Operation<T>>

が、これは可能ですが取ることができるでしょうか?

コンテキスト:私は、算術「連鎖反応」を形成するために組み合わせることができるポリシーベースのファンクタを構築しようとしています。ある操作では、Functionポリシークラスを使用して何をすべきかを判断し、2つのSourceオブジェクトを引数として取ります。ソースオブジェクトは、Functionポリシーまたはその他のOperationのいずれかであり、これらの両方が関数T execute()を定義します。最終的な目標は、これらのファンクタを呼び出すことによって実行時にこれらの算術演算をコマンドで実行することです。

あなたが使用すること
+1

'Operation'はクラスではないので、テンプレート型の引数には使用できません。 'Operation'はテンプレートクラスであるため、テンプレートテンプレート型パラメータの代わりに使用できます。 'Operation 'はクラスであり、テンプレート型の引数の代わりに使うことができます。 – bolov

+1

抑制テンプレートを作成しようとしていますか?もしあなたがそうであれば、 '' boost :: proto'(http://www.boost.org/doc/libs/1_65_1/doc/html/proto.html)があなたのために何をすることができるのか調べたいかもしれません。 – NathanOliver

+0

@ NathanOliverは、これが実際に私がやろうとしていることであり、より一般的なものでしかありません。リソースをありがとう! – stimulate

答えて

3

template<typename T, typename... OP> 
class Operation{ 
    // ... 
}; 

が、使用方法は、テンプレートテンプレートパラメータのテンプレート引数は名前A、ID-式でなければなりません

Operation<float> op1(0.3f); 
Operation<float, Operation<float>> op2(0.5f, op1); 
+0

ありがとうございます。今明らかになっている種類。私はインスタンス化されたクラスを渡す必要がありますが、引数としてテンプレートを渡そうとしました。 – stimulate

1

http://en.cppreference.com/w/cpp/language/template_parameters

だろうクラステンプレートまたはテンプレートエイリアス。

引数がクラステンプレートの場合、パラメータと一致するときにプライマリテンプレートのみが考慮されます。部分的な特殊化は、存在する場合にのみ、このテンプレートのテンプレートパラメータに基づく特殊化がインスタンス化された場合にのみ考慮されます。

私はこれがあなたの問題に役立つことを願っています。 「テンプレートテンプレート引数」を探します。

関連する問題