つい 0*n が 0 に最適化されそうな気がしてしまうけど、されるわけは無いよね。0*NaNはNaN何だし。な、NaNだってー!
うーん、仕方ないなぁ、(C ? C*n : 0)とかなら大丈夫かなぁ。いや、おとなしく個別の関数を用意すべきか……。
結局以下のようなクラステンプレートを作って回避した。
template<int C> struct OptimizedFloatMul { static float mul(float n) { return n * C;}};
template<> struct OptimizedFloatMul<1> { static float mul(float n) { return n;}};
template<> struct OptimizedFloatMul<0> { static float mul(float n) { return 0;}};
template<> struct OptimizedFloatMul<-1> { static float mul(float n) { return -n;}};
template<int PLANE_X, int PLANE_Y, int PLANE_Z, int PLANE_W>
struct HomogeneousClipFuncs
{
static ElementType dotByPlane(const VectorType &p)
{
return OptimizedFloatMul<PLANE_X>::mul(p.x)
+ OptimizedFloatMul<PLANE_Y>::mul(p.y)
+ OptimizedFloatMul<PLANE_Z>::mul(p.z)
+ OptimizedFloatMul<PLANE_W>::mul(p.w);
}
struct IsInside
{
bool operator()(const PointType &p) const{
return dotByPlane(VectorType(p)) >= ElementType(0);
}
};
...