
I just came up with this handy class. I was wondering if it might have a place in Boost somewhere. Perhaps it already exists, and I didn't find it? It creates a syntax for chained comparison expressions. Ideally you'd want to be able to do the following in C++: if (0 <= i < N <= INT_MAX) f(); But this doesn't work as expected, because it would actually be evaluated like this: if (((0 <= i) < N) <= INT_MAX) f(); You would actually need to use the following code: if (0 <= i && i < N && N <= INT_MAX) f(); The alternative I propose is this: if (c(0) <= i < N <= INT_MAX) f(); It has the advantage of being shorter, of being closer to the usual mathematical notation, and of evaluating i and N only once. This is useful if they have side-effects. It requires the following class and function (which I'm sure could be improved). What do you think? --------------------------------------------------------------------- template <class T> class Comparison { public: Comparison(T value, bool truth = true) : _last(value), _truth(truth) {} template<class U> Comparison<U> operator==(U val) { return Comparison<U>(val, _truth && _last == val); } template<class U> Comparison<U> operator!=(U val) { return Comparison<U>(val, _truth && _last != val); } template<class U> Comparison<U> operator<(U val) { return Comparison<U>(val, _truth && _last < val); } template<class U> Comparison<U> operator>(U val) { return Comparison<U>(val, _truth && _last > val); } template<class U> Comparison<U> operator<=(U val) { return Comparison<U>(val, _truth && _last <= val); } template<class U> Comparison<U> operator>=(U val) { return Comparison<U>(val, _truth && _last >= val); } operator bool() { return _truth; } private: T _last; bool _truth; }; template <class T> Comparison<T> c(T val) { return Comparison<T>(val); } --------------------------------------------------------------------- -- Michiel Helvensteijn