mpl::fold で遊んでみた
いまさら fold が便利だという事に気がついた!
やっぱり、自分でコードを書かないとダメですねー。
[ソース]
// 文字数が足りなかったので、ユーザ側で文字数を拡張 #define BOOST_MPL_LIMIT_STRING_SIZE 48 #include <boost/mpl/fold.hpp> #include <boost/mpl/vector.hpp> #include <boost/mpl/string.hpp> #include <boost/mpl/copy.hpp> #include <boost/mpl/back_inserter.hpp> #include <boost/mpl/equal.hpp> namespace mpl = boost::mpl; typedef mpl::vector< mpl::string<'yaki','niku','tabe','tai'>, mpl::string<'nyao','cat'>, mpl::string<'no'>, mpl::string<'ogor','ideJ','P'> > seq; template<typename T, typename U> struct joint : mpl::copy<T, mpl::back_inserter<U> >{}; typedef mpl::fold< seq, mpl::string<'#'>, mpl::if_< mpl::equal<mpl::string<'#'>, mpl::_1, mpl::quote2<boost::is_same> >, joint<mpl::_2, mpl::_1>, joint<mpl::_2, joint<mpl::string<'_'>, mpl::_1> > > >::type yakinikutabetai; #include <iostream> int main(){ std::cout << mpl::c_str<yakinikutabetai>::value << std::endl; return 0; }
[出力]
#yakinikutabetai_nyaocat_no_ogorideJP
とりあえず、mpl::apply に mpl::equal を突っ込んでエラーになった時に悩むのをどうにかしたいです……。
あとコンパイル時に mpl::string の内容が出力できれば…!!
[boost]
- ver 1.46.1