つい 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); } }; ...