動的/静的多型は、アプリケーションの設計と要件によって異なることを理解しています。しかし、可能であれば、常に静的多型を動的に選択することをお勧めしますか?まだテンプレートの形式のインターフェイスを提供しながら、何のvtableのルックアップオーバーヘッドを:CRTPを使用していない静的ポリモーフィズムを実装DyamicとC++の静的多型:これは好ましいですか?
:特に、私は反対をお勧めしているように見えるどちらも、私のアプリケーションでは、次の2設計上の選択を見ることができますベースクラス。しかし、動的な多型
- 危険で正しいクラス/メソッドにアクセスするスイッチとはstatic_castのロットを使用して:アクセサ/ミューテータ ようにも些細な機能のためのルックアップコストを関連付け、インターフェイス(純粋仮想クラス)を実装
私のアプリケーションは非常にタイムクリティカルなので、静的な多形性を優先します。しかし、あまりにも多くのstatic_castを使用することは、設計が貧弱であることを示すものであり、遅延を招くことなく回避する方法を知る必要があります。
EDIT:洞察のためにありがとう。具体的なケースを考えてみましょう。どれが良いアプローチですか?
class IMessage_Type_1
{
virtual long getQuantity() =0;
...
}
class Message_Type_1_Impl: public IMessage_Type_1
{
long getQuantity() { return _qty;}
...
}
OR
template <class T>
class TMessage_Type_1
{
long getQuantity() { return static_cast<T*>(this)->getQuantity(); }
...
}
class Message_Type_1_Impl: public TMessage_Type_1<Message_Type_1_Impl>
{
long getQuantity() { return _qty; }
...
}
注意が各クラスにはいくつかのミューテータ/アクセサがあり、私は自分のアプリケーションのインターフェイスを指定する必要がないということ。静的多型では、メッセージタイプを取得するために1回だけ切り替わります。しかし、動的な多態性では、私はそれぞれのメソッド呼び出しに仮想関数を使用しています。静的なポリを使用することはできませんか?私はCRTPのstatic_castはかなり安全で、パフォーマンスのペナルティは(コンパイル時間バインド)はないと思いますか?
switch-case構造体は、vtableを使用するのと同じ複雑さを持ちます。 – user877329
静的多型を使用するときにstatic_castとスイッチがたくさんあると思われる理由がわかりません - いくつかのサンプルコードを表示できますか? –
@MichaelAnderson:静的多型を必要とする状況で静的多型を使用しようとすると、そのようになります。そのような場合は、動的ポリモーフィズムを再作成しようとするのではなく、使用することがほぼ確実です。 –