エラトステネスの篩
を 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>> || ]