1

具体的な例から始めましょう。C++ では、抽象基本クラスの下にクラスの階層がありますCollisionVolume。衝突ボリュームはdetectCollision、他のボリュームとできる必要があります。この衝突コードは、存在する 2 つのサブクラスに基づいて特殊化されていますが、交換可能ですdetectCollision(a, b) == detectCollision(b, a)

オブジェクトは通常抽象基本クラスであるため、仮想関数と同様のメカニズムを使用する必要があります。ただし、一般的な仮想メソッドを使用すると、選択された関数はオペランドの 1 つの型にのみ依存し、両方には依存しません。これを行うことができた唯一の方法は、RTTI または RTTI のようなメカニズムを使用することでした。

これを行うためのよりクリーンな方法はありますか?

4

3 に答える 3

2

あなたは複数の発送を探しています。効率的に実装するのが難しいため、C++ にはありません。他のほとんどの静的型付け/効率指向言語もそうではありません。あなたの RTTI ソリューションは、おそらくそれを偽装するための最良の方法です。

于 2010-02-04T00:04:03.097 に答える
1

C++ でマルチメソッドをエミュレートするソリューションはいくつかあります。

問題の解決に役立つ参考資料を次に示します。

S.Meyers「より効果的な C++」、項目 31: 複数のオブジェクトに関して関数を仮想化する。

A.Alexandrescu 「最新の C++ 設計」、第 11 章 マルチメソッド

C++ での MultiMethods: Danil Shopyrin による完全なソリューションの検索

複数発送。テンプレートと RTTI を使用した新しいアプローチ、Carlo Pescio 博士、C++ レポート、1998 年 6 月。

Multimethods を C++ に追加するための草案 (ここここ)

于 2010-02-04T08:29:03.670 に答える
0

読んだときにビジターパターン(?)のように見える私の最初のアイデアは、オブジェクトに関するいくつかの重要な情報を返す仮想関数を作成し、次に、detectCollision()2つのオブジェクトによって返された重要な情報を比較することです。このようにして、各オブジェクトは特殊な情報を返すことができますが、一般化された方法で比較することができます。

これは最も効率的な方法ではないかもしれませんが、比較的簡単に思えます。

于 2010-02-04T08:38:10.167 に答える