Perfect Numbers CXX TMP
From base48
Don't try to run that on your machine ;-)
#include <boost/mpl/long.hpp> #include <boost/mpl/range_c.hpp> #include <boost/mpl/vector_c.hpp> #include <boost/mpl/arithmetic.hpp> #include <boost/mpl/accumulate.hpp> #include <boost/mpl/back_inserter.hpp> #include <boost/mpl/equal.hpp> #include <boost/mpl/copy_if.hpp> #include <boost/mpl/at.hpp> #include <boost/mpl/size.hpp> #include <iostream> namespace mpl = boost::mpl; template < typename Sum , typename Div , typename Num > struct perf_num_plus_if : mpl::if_< mpl::equal_to< mpl::modulus< Num,Div > , mpl::long_<0> >, typename mpl::plus<Sum,Div>::type, Sum >::type {}; template< typename Num > struct perf_num_impl : mpl::accumulate< mpl::range_c< long, 1, Num::value/2+1 >, mpl::long_<0>, perf_num_plus_if< mpl::_, mpl::_, Num > >::type {}; template< long Start , long End > struct perfect_number : mpl::copy_if< mpl::range_c<long,Start,End>, mpl::equal_to< mpl::_1 , perf_num_impl<mpl::_1> >, mpl::back_inserter< mpl::vector_c<long> > >::type {}; template< typename Seq , size_t Pos , size_t Max > struct Output { Output() { std::cout << mpl::at_c<Seq, Pos >::type::value << std::endl; Output< Seq , Pos+1 , Max >(); } }; template< typename Seq , size_t N > struct Output< Seq , N , N > { Output(){} }; int main() { typedef perfect_number< 1 , 500 > vec; Output< vec , 0 , mpl::size< vec >::value >(); }