Boost.Lambda + type_switch

昨日のパターンマッチ、Boost.Lambdaを使うとこう書けました。

#include <iostream>
#include <utility>
#include <boost/variant.hpp>
#include <boost/type_switch.hpp>
#include <boost/mpl/arg.hpp>
#include <boost/lambda/lambda.hpp>

using std::pair;

typedef
    boost::variant<
        int,
        pair<int, double>,
        pair<int, int>,
        pair<double, int>
    >
type;

void f(type var)
{
    using namespace boost::type_switch;
    using namespace boost::mpl::placeholders;
    namespace bll = boost::lambda;

    switch_(var)
        |= case_< pair<_1, _1> >(std::cout << bll::constant("pair<_1, _1>\n"))
        |= case_< pair<int, _> >(std::cout << bll::constant("pair<int, _>\n"))
        |= case_< int >         (std::cout << bll::constant("int\n"))
        |= default_             (std::cout << bll::constant("default\n"))
    ;
}

int main()
{
    f(std::make_pair<int, int>(1, 2));       // pair<_1, _1>
    f(std::make_pair<int, double>(1, 3.14)); // pair<_1, _1>...おかしいまま
    f(3);                                    // int
}

pair<_1, _1>で「2つの同じ型」という制約にはならないのかなーと悩み中。


pairとすれば、2つめがpairにマッチするようになります。
現在見つけたtype_switchのいいところは、マッチするパターンがなかったらコンパイルエラーになること。