template <typename N>
using zero = tmpl::integral_constant<typename N::value_type, 0>;
template <typename Sequence, typename N, typename NewType>
tmpl::append<tmpl::front<tmpl::split_at<Sequence, N>>,
tmpl::list<NewType>,
tmpl::pop_front<tmpl::back<tmpl::split_at<Sequence, N>>>>;
template <typename Start, typename End>
using range_from_types =
tmpl::range<typename Start::value_type, Start::value, End::value>;
template <typename N>
using primes =
tmpl::remove<
tmpl::fold<
tmpl::range<typename N::value_type, 2, N::value>,
tmpl::push_front<
tmpl::range<typename N::value_type, 2, N::value>, zero<N>, zero<N>>,
tmpl::bind<
tmpl::apply,
tmpl::if_<
tmpl::or_<
std::is_same<
tmpl::bind<tmpl::at, tmpl::_state, tmpl::_element>, zero<N>>,
tmpl::greater_equal<
tmpl::times<tmpl::_element, tmpl::_element>, N>>,
tmpl::defer<
tmpl::parent<tmpl::_state>>,
tmpl::defer<
tmpl::parent<
tmpl::lazy::fold<
tmpl::bind<
range_from_types,
tmpl::_element,
tmpl::next<tmpl::divides<tmpl::prev<N>, tmpl::_element>>>,
tmpl::_state,
tmpl::defer<
tmpl::bind<
tmpl::_state,
tmpl::times<tmpl::parent<tmpl::_element>, tmpl::_element>,
zero<N>>>>>>>>>,
zero<N>>;
assert_same<
primes<tmpl::size_t<100>>,
tmpl::integral_list<size_t, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97>>();