読者です 読者をやめる 読者になる 読者になる

Boost.Fusionでreplicate

C++

ある値をn回繰り返したシーケンスを作る、Haskellにある関数replicate。これをBoost.Fusionで作るとしたらこうなるでしょう、ということで書いてみました。Boost.Fusionには、boost::arrayをFusion Sequenceと見なす機構があるので、それを使ってるだけです。

#include <iostream>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/include/for_each.hpp>
#include <boost/phoenix.hpp>

#include <boost/array.hpp>
#include <boost/fusion/include/boost_array.hpp>

namespace result_of {
    template <class T, int N>
    struct replicate {
        typedef boost::array<T, N> type;
    };
}

template <int N, class T>
typename result_of::replicate<T, N>::type
    replicate(const T& x)
{
    typedef
        typename result_of::replicate<T, N>::type
    result_type;

    result_type result;
    result.fill(x);

    return result;
}


int main()
{
    namespace fusion = boost::fusion;
    using namespace boost::phoenix::arg_names;

    fusion::vector<int, int, int> v(replicate<3>(1));
    fusion::for_each(v, std::cout << _1 << std::endl);
}
1
1
1

他に考えられる方法としては、fusion::vectorにn回push_backするくらいですかね…