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