私は抽象クラスに他のクラスの基本であるを持っている、のは、BとCをしましょう。オーバーライド関数に渡された引数がわからない場合は、ベースクラスでオーバーライドされたメソッドを作成しますか?
クラスBとCはvoid
タイプhandle_input
方法を有していなければならないが、引数の数とタイプは、BからCに変化してもよいです。
Iはまた、引数としてにポインタをとる機能を有する - 多形、B又はCのいずれかであり得ること、話す - 及び方法handle_input
を呼び出します。 A::handle_input
を定義するときB::handle_input
に渡される引数は、C::handle_input
に渡されたものと異なる場合がありますので
問題が来ます。
/* base class */
class A {
template <class... FUNCTION_ARGS>
virtual void handle_input(FUNCTION_ARGS&&...) = 0;
};
しかしテンプレートはコンパイル時に計算されるため、エラーが発生し、仮想ながら、実行時に使用されている:私はクラスに何かなどを作成するためのLED
。
私も
class A {
template <class... FUNCTION_ARGS>
using input_handler = function<void(FUNCTION_ARGS&&...)>;
template <class... FUNCTION_ARGS>
input_handler<FUNCTION_ARGS...> handle_input;
};
をしました。しかし、予想通りの成果は、多かれ少なかれ同じです。
私は私の質問はだろうと思い、「あなたが潜在的に複数のオーバーライド関数に渡される引数を知らないとき、どのようにあなたは、基本クラスでオーバーライドされたメソッドを作成することができますか?」
注意事項(私が間違っているなら、私を修正):
handle_input
が動的に多型であるので、それを仮想なければなりません。handle_input
の引数番号が不明なため、パラメータパックを使用する必要があります。私はここでの説明で非常に優れた実装を提供してきました
A)あなたは、仮想テンプレート機能を持つことができません。 B)仮想関数のシグネチャ内の型は、同じか共変でなければならず、同じ数でなければならない。 – NathanOliver
入力基本クラスを作成してBに入力をグループ化し、Cへの入力をその基本入力クラスから派生した2つの異なるクラスにグループ化するとします。そうすれば、クラスAの仮想関数は基本入力型へのポインタを取ることを宣言できます。次に、BとCの中で動的キャストを行い、適切な入力クラスを取得する必要があります。これはおそらく、基本入力クラスで宣言されていないゲッター関数が異なるでしょう(2つの入力タイプ)...それはきれいだと言っていないが、それを持っていなければならない場合... – RyanP