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

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

スマート列挙型その3

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ライブラリの変態コード(註:褒め言葉)を思い出して作った、括弧数珠繋ぎの面妖な表記。
だんだんスマートから外れてきている気もします。