Minmaxクラス
相変わらずしょうもないものを作るのが大好きなのです。
template<typename T> class MinMax; template<typename T> class MinMax2 { public: MinMax2(MinMax<T>& raw) : raw_(raw){} public: MinMax2& operator,(typename boost::call_traits< T >::param_type data) { if (data < raw_.min) raw_.min = data; else if (data > raw_.max) raw_.max = data; return *this; } public: MinMax<T>& raw_; }; template<typename T> class MinMax { public: MinMax(){}; public: MinMax& operator=(typename boost::call_traits< T >::param_type data) { min = data; return *this; } MinMax2<T> operator,(typename boost::call_traits< T >::param_type data) { if (data < min) { max = min; min = data; } else { max = data; } return *this; } public: T min; T max; }; #define MINMAX(type, name) MinMax< type > name; name int main() { MINMAX(float, minmax) = 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0; printf("%f, %f\n", minmax.min, minmax.max); return 0; }
gcc 4.3.0ではちゃんと定数展開されるのを確認した。