エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

スマート列挙型

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;
    }
}

わざわざクラスを定義せず、第一引数に評価したい値を指定する関数でも充分機能するのだけれど。それだとどことなくスマートでないので。