template<typename T> class EnumValue { public: EnumValue(T value) : value_(value) {} inline bool in(const T a1) const { return value_ == a1; } inline bool in(const T a1, const T a2) const { return (value_ == a1) || in(a2); } inline bool in(const T a1, const T a2, const T a3) const { return (value_ == a1) || in(a2, a3); } // 以下略 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; } }
わざわざクラスを定義せず、第一引数に評価したい値を指定する関数でも充分機能するのだけれど。それだとどことなくスマートでないので。