私は、テンプレートの引数として入力の数として符号なし整数をとるクラステンプレートを入力しました。このテンプレートはoperator()
をオーバーロードし、Function
は与えられた入力のセットに対して評価することができます。1つのメンバ関数のみを変更するクラステンプレートの特殊化
通常、このメンバーのプロトタイプの1つはoperator()(double, ...)
です。しかし、テンプレート引数が0の場合、プロトタイプは機能しません。少なくとも1つの引数が必要です。
template <unsigned Arity>
struct Function {
void operator() (double, ...);
};
通常、私はちょうどテンプレートの特殊化を書くと思いますが、他のメンバ関数がたくさんあるので、冗長なコードのたくさんが存在することになります。繰り返しますが、通常、メインクラスの定義と継承する特殊化のための冗長コードを含む基本クラスを作成します。
struct FunctionBase {
// Common code
Function operator + (Function const &) const; // ?
};
template <unsigned Arity>
struct Function : FunctionBase { /* etc */ };
例operator+
ためFunction
を返すように意図されているので残念ながら、私は、これをやって行くのかわかりませんよ。しかし、Function
があとで定義された場合、どうすればいいですか? 、Function
基底クラスから継承し、この設計によりoperator+
は、基底クラスである...
それは、基本クラスのインスタンスを返すことができたが、その後、私たちはFunction
のインスタンスにそのインスタンスを変換する方法が必要です最初のインスタンスのデータをコピーせずにこれを行う方法がないことはわかっています。これはパフォーマンス面で非常に高価です。
どうすればこの問題を解決できますか?
C++は難しいですが。あなたが良い提案を得ることを望むなら、あなたの質問にあなたがしたいことの具体例を含める必要があります。特に変更できないすべてのビットを指摘します。これはあまりにも曖昧です。出発点は、「あなたは単一のクラスメソッドを専門化することはできません。クラス全体を専門化する必要があります」。だから回避策を見つける必要があります。最初にいくつかのコードを投稿してください。 –
これは一つの重大な段落です。それに関係なく、クラスを前方宣言し、その型を関数宣言で戻り値の型として使用し、クラスを定義し、関数を定義することができます。 – Quentin
あなたが何を求めているのかは不明です。それを改善するためにあなたの投稿を編集しない限り、それはおそらく閉会に投票されます。 See [ask]。 –