問題タブ [static-polymorphism]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
boost - 抽象的なファクトリ デザイン パターンを使用できるブースト ツールの組み合わせはどれですか?
私が理解していることから、boost::function、boost::factory、および std::map の組み合わせにより、オブジェクト ファクトリを作成できます。http://www.boost.org/doc/libs/1_49_0/libs/functional/factory/doc/html/index.html Loki には抽象ファクトリがありますが、何らかの理由で boost にはありません。抽象ファクトリ パターンを使用するブースト方法は何でしょうか?
私が考えることができる 1 つの方法は、製品を手動で作成するためのインターフェイスを抽象化することです。つまり、同じ作成ポリシーで製品を作成することです。
あなたの答えが静的ポリモーフィズムを使用していれば、もっとうれしいです。
c++ - C ++での動的ポリモーフィズムと静的ポリモーフィズム:どちらが望ましいですか?
動的/静的ポリモーフィズムは、アプリケーションの設計と要件に依存することを理解しています。ただし、可能であれば、動的ではなく静的ポリモーフィズムを常に選択することをお勧めしますか?特に、私のアプリケーションでは次の2つの設計上の選択を見ることができますが、どちらも推奨されていないようです。
CRTPを使用して静的ポリモーフィズムを実装します。テンプレート基本クラスの形式でインターフェイスを提供しながら、vtableルックアップのオーバーヘッドはありません。ただし、多くのスイッチとstatic_castを使用して、正しいクラス/メソッドにアクセスします。これは危険です。
動的ポリモーフィズム:インターフェース(純粋仮想クラス)を実装し、アクセサー/ミューテーターのような些細な関数でもルックアップコストを関連付けます
私のアプリケーションは非常にタイムクリティカルなので、静的ポリモーフィズムを支持しています。ただし、static_castの使用が多すぎることが設計が不十分であることを示しているかどうか、および遅延を発生させずにそれを回避する方法を知る必要があります。
編集:洞察に感謝します。特定のケースを取り上げると、これらのどれがより良いアプローチですか?
また
各クラスにはいくつかのミューテーター/アクセサーがあり、アプリケーションでインターフェースを指定する必要があることに注意してください。静的ポリモーフィズムでは、メッセージタイプを取得するために一度だけ切り替えます。ただし、動的ポリモーフィズムでは、各メソッド呼び出しに仮想関数を使用しています。それは静的ポリを使用する場合にはなりませんか?CRTPのstatic_castは非常に安全で、パフォーマンスの低下(コンパイル時の制限)はないと思いますか?
c++ - テンプレート リーフ クラスを使用した奇妙な繰り返しテンプレート
私は自分のアプリケーションに不思議なことに繰り返されるテンプレート パターンを使用することを考えています。ただし、クラスがユーザー定義型で動作するようにしたいと思います。以下に示すような構造を作成できるかどうかを理解したいと思います。
上記のコードは、次のエラーでコンパイルに失敗します。
「テンプレート クラス BaseTrajectoryPoint」のテンプレート パラメーター リストの引数 1 で型/値が一致しません</p>
問題にアプローチする別の方法はありますか? 静的ポリモーフィズムを使用したいのですが、基本クラスで可能なすべてのメソッドを定義したいと考えています。
boost - CRTP を介して基本クラスのブースト スマート ポインターに基づいて派生クラス メンバーにメモリを割り当てる
質問のこの部分は背景情報を提供するものであり、無視できます
私は、不思議なことに繰り返されるテンプレート パターンの使用に大きく依存するテンプレート ライブラリに取り組んでいます。クラス構造の背後にある考え方は、ユーザーが次のいずれかを実行できるということです。
1)。標準メソッドで事前定義されたクラスを使用します。これらのクラスは、コンストラクタ/デストラクタのみを提供し、変数メンバーを宣言し、基本クラスをフレンドとして宣言する基本クラスの非常に単純なリーフです。派生クラスの変数メンバーを操作するすべてのメソッドは、基本クラスで定義されます。
2)。基本クラスを使用して、独自の拡張機能を作成します。このメソッドにより、ユーザーは同じ変数メンバーで動作する独自のメソッドを導入することもできます。
設計により、単一レベルの継承のみが適用されます。
私の質問は、主に節 2 に関するものです。現在の実装では、ユーザーはすべてのコンストラクターを暗黙的に定義する必要があります (つまり、クラスの動的変数メンバーのメモリ割り当ての完全なプロセスを記述するなど)。
質問
以下の例は、CRTP を使用して、基本クラス コンストラクター内の派生クラスのヒープ変数のメモリ割り当ての定義を提供する可能性についての調査を示しています。
基本クラスの一部
派生クラス:
主要:
コードは次の出力を生成します。
出力は、コンセプトが実現可能である可能性があることを示唆しています。ただし、2 つの質問があります。
1)。コードの実行中に発生するすべてのプロセスを理解していることを確認したいと思います。特に、上記のクラスからかなりの量のオブジェクトをインスタンス化する必要がある可能性があるため、プロセスの効率に関心があり、何が起こるかを理解したいPoint
(隠された再定義はありますか?)
2)。boost
質問は、派生クラスのメンバーのスマート ポインターを定義するためのライブラリの使用に関連しています。raw ポインターを に置き換えようとboost::shared_ptr
したときに、基本クラスを介して派生クラスのメンバーにメモリを割り当てようとすると、セグメンテーション フォールト エラーが発生しました。コードの重要なセクションを以下に示します。
基本クラスの一部:
派生クラスの一部:
主要:
コードは次の出力を生成します。
私も試しscoped_ptr
ました。ただし、実行時に失敗しましたが、別のエラーが発生しました:
ブーストスマートポインターの動作の詳細に関連していると思います。この問題を解決する方法を知っている人はいますか?
c++ - 静的ポリモーフィズムとメソッド名 c++
静的ポリモーフィズム (CRTP) を使用する場合、ポリモーフィック メソッドに名前を付ける良い方法はありますか?
私の知る限り、インターフェイスと実装は同じ名前にすることはできません (それらが仮想である場合のように)。クラス階層が深い場合、それはちょっと厄介です。
何か良い対処法はないでしょうか?それとも私が間違っているだけですか?
c++ - 派生する CRTP 基本クラスの選択
次の非常に単純な CRTP 基本クラスがあるとします。
また、いくつかの派生クラス。すべてがうまく機能しますが、問題があります.2つのクラスにランタイムポリモーフィック動作を持たせたい(コンテナに入れる必要がある)特定の状況が1つ(またはおそらく2つ)あります。言い換えれば、派生 CRTP クラスの一部にも仮想バージョンを持たせたいと考えています。そこで、次のクラスを思いつきました。
ここで、ランタイム ポリモーフィズムが必要な場合は、このクラスから派生させます。DerivedB
派生クラスに仮想バージョンを持たせたいとしましょう。バニラ DerivedB は次のようになります。
私がやりたいことは、基本的にこのクラスに追加のテンプレート パラメーターを追加して、コンパイル時に Base (シミュレートされた「動的」バインディングが必要な場合) または VirtualBase (実際の動的バインディングが必要な場合) から派生するかどうかを選択できるようにすることです。 )。次の疑似 C++ のようなもの:
したがって、プレーンな CRTP の場合はBase
asB
を渡し、仮想クラスの場合はVirtualBase
asを渡しますB
。もちろん、問題は、それらが異なる数の引数を取ることです(Base
派生クラスのタイプが必要です)。私は実用的な解決策を思いつくことができません。
では、コンパイル時に基本クラスを選択するにはどうすればよいでしょうか。または、これがあまりにも複雑/不可能な場合、クラスの静的 (CRTP) バージョンと動的 (仮想) バージョンを作成する最も簡単な方法は何でしょうか?それ以外の場合、実装は同じです。
polymorphism - UML クラス図での静的ポリモーフィズムの描写
ビルド構成に従ってコンパイル中にインスタンス化されるオブジェクトがあります。周囲のソフトウェアが考慮する限り、オブジェクトは同じインターフェイスを公開します。static polymorphism
通常の動的ポリモーフィズムとは対照的に、インスタンス化の決定がコンパイル中に行われるという事実 (つまり ) をモデル化したいと思います。
で静的ポリモーフィズムを表現する方法はありUML
class diagram
ますか?
これが多かれ少なかれ私が必要とするものです:
明らかに、上記の型定義の 1 つだけがコンパイル時にインスタンス化されます。
c++ - CRTP とマルチレベル継承
私の友人は、「CRTP を使用してマルチレベル継承のポリモーフィズムを置き換える方法」と尋ねました。より正確には、次のような状況で:
私の友人と私は、CRTP がポリモーフィズムのドロップイン代替ではないことを理解していますが、両方のパターンを使用できる場合に関心があります。(この質問のために、各パターンの長所と短所には関心がありません。)
c++ - ポリシー間でメンバーを共有する方法は?
メンバーを保持するホスト クラスがあるとします。
そして、p1 と p2 で同じメンバーを使用したい:
それを行う方法はありますか?
私が考えることができる 1 つの方法は、仮想継承を介してメンバーを含む別のクラスから派生p1
するp2
ことです。これにより、物事が複雑になります。
もう 1 つは、メンバーを関数の引数としてポリシーに渡すことです。このようなもの:
もう 1 つの考えは、CRTP を使用して、ポリシーからホストを取得し、ホストからポリシーを取得して、メンバーにアクセスできるようにすることusing
でしたが、それは不可能です。
更新 (1)
CRTPでの私の試み