昨日のパターンマッチ、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
現在見つけたtype_switchのいいところは、マッチするパターンがなかったらコンパイルエラーになること。