エラトステネスの篩

を Boost.MPL で。

[ソース]

#include <boost/mpl/print.hpp>
#include <boost/mpl/vector_c.hpp>
#include <boost/mpl/range_c.hpp>
#include <boost/mpl/modulus.hpp>
#include <boost/mpl/copy.hpp>
#include <boost/mpl/copy_if.hpp>
#include <boost/mpl/not_equal_to.hpp>
#include <boost/mpl/back_inserter.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/less_equal.hpp>
#include <boost/mpl/multiplies.hpp>
#include <boost/mpl/push_back.hpp>
#include <boost/mpl/back.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/at.hpp>


namespace mpl = boost::mpl;

template<typename Seq, typename N>
struct prime_filter
    : mpl::copy_if<
        Seq,
        mpl::not_equal_to<
            mpl::modulus<mpl::_1, N>,
            mpl::int_<0>
        >,
        mpl::back_inserter<mpl::vector<> >
    >::type
{};

template<typename Seq, typename N, typename Result>
struct prime_impl
    : mpl::eval_if<
        mpl::less_equal<
            typename mpl::back<Seq>::type,
            mpl::multiplies<
                N, N
            >
        >,
        mpl::copy<Seq, mpl::back_inserter<Result> >,
        prime_impl<
            prime_filter<Seq, N>,
            typename mpl::at_c<prime_filter<Seq, N>, 0>::type,
            typename mpl::push_back<Result, N>::type
        >
    >::type
{};

template<typename Seq>
struct prime : prime_impl<Seq, typename mpl::at_c<Seq, 0>::type, mpl::vector<> >{};

typedef mpl::range_c<int, 2, 30> seq;

typedef mpl::print<prime<seq>::type>::type hoge;


int main(){}

[出力]

|| main.cpp
\boost\boost_1_47_0\boost\mpl\print.hpp|51 warning 4308| 負の整数定数が符号なしの型に変換されました。
main.cpp|55| コンパイルされたクラスの テンプレート のインスタンス化 'boost::mpl::print<T>' の参照を確認してください
||         with
||         [
||             T=boost::mpl::vector10<boost::mpl::integral_c<int,2>,boost::mpl::integral_c<int,3>,boost::mpl::integral_c<int,5>,boost::mpl::integral_c<int,7>,boost::mpl::integral_c<int,11>,boost::mpl::integral_c<int,13>,boost::mpl::integral_c<int,17>,boost::mpl::integral_c<int,19>,boost::mpl::integral_c<int,23>,boost::mpl::integral_c<int,29>>
||         ]