タイトルに申し訳ありませんが、より適切な名前が見つかりませんでした。誰かがより良いものを持っていれば、私は喜んでそれを変更します.
ソリッド ジオメトリ オブジェクトのセットがあるとします。
struct ray { ... };
struct plane { ... };
struct box { .... };
struct sphere { .... };
現在、交差アルゴリズム用のテンプレート化された関数を考えています。これにより、実行時にチェックする型に応じて関数の特殊なバージョンを作成できます。
template <typename operand_type1,
typename operand_type2>
RET_DATA check_intersection(operand_type1 operand1, operand_type2 operand2){ ... };
ray/shphere 交差の場合、次の実装を提供します。
template<> RET_DATA check_intersection<ray, sphere>(ray operand1, sphere operand2){ ... };
RET_DATA は意図的に未定義のままにしました。これは、それぞれの専門分野に応じて、異なる情報を返す必要がある場合があるためです。たとえば、この場合、交差点の数 (存在する場合) と関連するポイントを返すことができます。球-球の場合、交差のボリュームを返すことができます。問題は、このテンプレートのユーザーが知る必要がある新しい (戻り値の) 型も作成する必要があることです。
私の現在の最良の候補のアイデアは、ファンクターを作成し、各タイプに特化することです。ファンクター内で、それぞれの特殊化に共通の名前を持つ return 構造体を定義します (すなわち、result ):
/** templated functor */
template<typename T1, typename T2> struct check_intersect {
typedef intersection_data<T1, T2> result;
check_intersect(T1 operand1, T2 operand2) : operand1(operand1), operand2(operand2) {}
result operator()(T1 operand1, T2 operand2){ ... }
};
/** tempalted auxiliar return data type */
template<typename T1, typename T2> struct intersection_data { ... }
次に、データ型に応じて両方に特殊化を提供します。これは多かれ少なかれ、次の使用パターンで終わります。
check_intersect<ray, sphere>::result ret = check_intersect<ray, sphere>(my_ray, my_sphere);
最新の IDE を使用すると、問題はある程度軽減されますが、ユーザーは依然として結果を得るためにインターフェイスを推測する必要があります。これは私がそれについて好きではないことです。
このアプローチは欠陥がありますか? 今後のソリッドジオメトリタイプの拡張性を解決するためのより良い設計アイデアはありますか? これは最もエレガントなアプローチですか?
テンプレートはこれに適したツールではないかもしれません。ケースごとに異なる機能を提供することができます....
ありがとうございました。