私はジェネリックアルゴリズムを構築しようとしています。これまでのところ、以下の例のように、私は、クラス階層とポインタを使用して、これを達成している次のように動的多型ではなく静的なC++
struct Base{
virtual double fn(double x){return 0;}
};
class Derived : public Base{
double A;
public:
Derived(double a) : A(a) {}
double fn(double x) { return A*x;}
};
//Some other implementations
class algo{
double T;
std::unique_ptr<Base> b_ptr;
public:
algo(double t, std::unique_ptr<Base>& _ptr); //move constructor...
//Some constructors
double method(double x){ return T*b_ptr->fn(x);}
};
このセットアップ後、実装されています。
int main(){
std::unique_ptr<Derived> ptr(new Derived(5.4));
algo(3.2,ptr);
method(2.4);
return 0;
}
これはもちろん非常に単純な例であり、しかし、それは私の質問に役立ちます。私が理解しているところでは、このように派生クラスを使用すると、メソッドがコンパイル時ではなく実行時に選択されます。私は自分のアルゴリズムから動的な振る舞いを必要としないので、すべてがコンパイル時に決定されます。これは効率の無駄です。コンパイル時に静的多型を実行する方法はありますか?
私が理解するところでは、テンプレートを使用して静的多型を得ることが可能です。しかし、私はプリミティブではないタイプのインプリメンテーションテンプレートを見つけることができませんでした。上記の例のように、デフォルト以外のコンストラクタを持つ派生クラスが必要ですが、これは可能ではないようです...誰にどのようにして解決策を提示できますか?
不要についてのあなたの観察動的な振る舞いは賢明です:実行時に必要な実際の型を決定する必要がある場合は、多態的なクラス階層しか持たないようにしてください。良い例は、ネットワークプロトコルからのメッセージの解析、またはイベントループのイベントの処理です。そうでなければ、あなたが実際に必要とするタイプを知っていれば、仮想関数多形性は正しいツールではありません。 –
'テンプレートを使って静的多型を得ることしかできません.'多態性は、現在のオブジェクト型の正しい関数の基底を呼び出すことです。だから関数のオーバーロードは静的多型であるとも言いたい。 – ZijingWu