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