James Curran と Greg S は、問題を解決するための 2 つの主要なアプローチを既に示しています。
- それを必要とする STL アルゴリズムで明示的に使用されるファンクターを定義する、または
- 実際の演算子
==
と<
、ファンクタが指定されていない場合に使用する STL アルゴリズムを定義します。
どちらのソリューションもまったく問題なく慣用的ですが、演算子を定義するときに覚えておくべきことは、それらが効果的に型を拡張するということです。を定義operator<
するとglm::vec3
、これらのベクトルは「より小さい」関係を定義するように拡張されます。つまり、誰かが 1 つのベクトルが別のベクトルよりも「小さい」かどうかをテストしたいときはいつでも、演算子を使用します。したがって、演算子は、普遍的に適用できる場合にのみ使用する必要があります。これが常に3D ベクトル間の「より小さい」関係を定義する唯一の方法である場合は、先に進んでそれを演算子にします。
問題は、おそらくそうではないということです。いくつかの異なる方法でベクトルを並べ替えることができますが、どれも明らかに「正しいもの」ではありません。たとえば、ベクトルを長さで並べ替えることができます。または、具体的にはコンポーネントの大きさによって、 とx
を無視しy
ますz
。または、3 つのコンポーネントすべてを使用して関係を定義することもできます (たとえば、ax == bx の場合は y 座標を確認し、それらが等しい場合は z 座標を確認します)。
あるベクトルが別のベクトルよりも「小さい」かどうかを定義する明確な方法はないため、演算子はおそらく悪い方法です。
同等性については、演算子の方が適切に機能する可能性があります。ベクトルの等価性の定義は 1 つあります。すべてのコンポーネントが等しい場合、2 つのベクトルは等価です。
ここでの唯一の問題は、ベクトルが浮動小数点値で構成されているため、何らかのイプシロン比較を実行して、すべてのメンバーがほぼ等しい場合に等しいことです。しかし、イプシロンを変数にすることもできますが、operator==
2 つのパラメーターしかとらないため、 では実行できません。
もちろん、operator==
ある種のデフォルトのイプシロン値を使用することもできますし、可変イプシロンとの比較のためにファンクターを定義することもできます。
どちらを優先するかという明確な答えはありません。どちらのテクニックも有効です。ニーズに最も適したものを選択してください。