template<typename T> class EnumValue { public: class Result { public: explicit Result(T lhs, T rhs) : value_(lhs), result_(lhs == rhs) {} Result& operator () (T value) { result_ |= (value_ == value); return *this; } operator bool () const { return result_; } private: const T value_; bool result_; }; EnumValue(T value) : value_(value) {} Result in(T value) const { return Result(value_, value); } private: const T value_; }; template<typename T> EnumValue<T> enumValue(T value) { return EnumValue<T>(value); } enum Kanto { Chiba, Gunma, Ibaraki, Kanagawa, Saitama, Tochigi, Tokyo }; void hantei(Kanto k) { if(enumValue(k).in(Gunma)(Ibaraki)(Tochigi)) { std::cout << "北関東" << std::endl; } else if(enumValue(k).in(Chiba)(Kanagawa)(Saitama)(Tokyo)) { std::cout << "南関東" << std::endl; } else { std::cout << "どこだ?" << std::endl; } }
boostライブラリの変態コード(註:褒め言葉)を思い出して作った、括弧数珠繋ぎの面妖な表記。
だんだんスマートから外れてきている気もします。