#include class Interval { private: enum {normal, empty, whole} flag; double lower, upper; public: Interval(double low, double up) : flag(normal), lower(low), upper(up) {}; friend Interval addByValue(Interval a, Interval b); friend Interval addByConstRef(const Interval &a, const Interval &b); friend Interval addByRef(Interval &a, Interval &b); inline friend Interval addByValueInline(Interval a, Interval b) { return Interval(a.lower+b.lower, a.upper+b.upper); }; inline friend Interval addByRefInline(Interval &a, Interval &b) { return Interval(a.lower+b.lower, a.upper+b.upper); } inline friend Interval addByConstRefInline(const Interval &a, const Interval &b) { return Interval(a.lower+b.lower, a.upper+b.upper); }; friend std::ostream& operator<<(std::ostream &os, const Interval &obj); };