Variadic Templates 版 mpl::switch_

前回:http://d.hatena.ne.jp/osyo-manga/20110330/1301433540
   http://d.hatena.ne.jp/osyo-manga/20110413/1302712181

#include <boost/utility/enable_if.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/switch.hpp>
#include <boost/mpl/push_back.hpp>

namespace boost { namespace mpl {
namespace detail{

template<typename Seq, typename Inserter, typename ...Args>
struct variadic_sequence_impl;

template<typename Seq, typename Inserter, typename T, typename ...Args>
struct variadic_sequence_impl<Seq, Inserter, T, Args...>
    : mpl::apply<
        Inserter, variadic_sequence_impl<Seq, Inserter, Args...>, T
    >::type{};

template<typename Seq, typename Inserter, typename T>
struct variadic_sequence_impl<Seq, Inserter, T>
    : mpl::apply<Seq, T>::type{};

template<typename Seq, typename Inserter>
struct variadic_sequence_impl<Seq, Inserter>
    : mpl::vector<>{};

} // namespace detail{

template<typename Seq, typename Inserter, typename ...Args>
struct variadic_sequence : detail::variadic_sequence_impl<Seq, Inserter, Args...>{};

template<typename ...Args>
struct variadic_vector :
    variadic_sequence<
        mpl::vector1<mpl::_1>,
        mpl::push_front<mpl::_1, mpl::_2>,
        Args...
    >
{};

template<typename Case, typename Expr, typename T = void>
struct case_;

template<typename Case, typename Expr>
struct case_<Case, Expr, typename enable_if<is_lambda_expression<Expr> >::type>
    : pair<Case, Expr> {};

template<typename Case, typename Expr>
struct case_<Case, Expr, typename disable_if<is_lambda_expression<Expr> >::type>
    : pair<Case, always<Expr> > {};

template<typename Expr>
struct default_ : case_<always<mpl::true_>, Expr>{};

template<typename T, typename ...Cases>
struct match : switch_<
    variadic_vector<Cases...>, T
>{};

} } // namespace boost { namespace mpl {

#include <boost/mpl/string.hpp>
#include <boost/mpl/apply.hpp>
#include <iostream>
#include <string>

namespace mpl = boost::mpl;
using mpl::_1;

template<typename T>
struct check :
    mpl::match<
        T,
        mpl::case_<boost::is_same<int,   _1>, mpl::string<'int'> >,
        mpl::case_<boost::is_same<float, _1>, mpl::string<'floa', 't'> >,
        mpl::case_<boost::is_same<char,  _1>, mpl::string<'char'> >,
        mpl::default_<mpl::string<'no m', 'atch'> >
    >
{};

int
main(){
    std::cout << mpl::c_str<check<int   >::type>::value << std::endl;
    std::cout << mpl::c_str<check<float >::type>::value << std::endl;
    std::cout << mpl::c_str<check<char  >::type>::value << std::endl;
    std::cout << mpl::c_str<check<double>::type>::value << std::endl;
    
    return 0;
}

[出力]

int
float
char
no match


mpl::case_ の辺りがどうしても長くなってしまうので何とかしたい。
mpl::case_equal とか、mpl::case_equal_to とか用意すればいいんですかね。
もうちょっとなんとかしたいです。
fall through ?なにそれおいしいの。


[boost]
ver 1.46.1