#include<iostream>

// 数値
template<int n>
struct num {
    enum{ value = n };
};

// リストの終端
struct term{};

// リストのセル
template<typename firstT, typename secondT >
struct cell {
    typedef firstT first;
    typedef secondT second;
};

// リストのダンプ
template< typename T>
struct dump;
template< typename firstT, typename secondT >
struct dump< cell< firstT,secondT > >{
    static void exec( void ) {
        std::cout<< firstT::value<< ",";
        dump<secondT>::exec();
    }
};
template< typename firstT>
struct dump< cell< firstT, term > >{
    static void exec( void ) {
        std::cout<< firstT::value<< std::endl;
    }
};

// 整数リストの生成
template<int from, int to>
struct list_gen{
    typedef cell< num<from>, typename list_gen<from+1,to>::type > type;
};
template<int to>
struct list_gen<to, to>{
    typedef cell< num<to>, term > type;
};

// aがbで割れるかどうかを返す
template< int a, int b>
struct is_div{
    enum { value = (a%b == 0) };
};

// is_prime実装用
template< int i, int d >
struct is_prime_sub{
    enum{ value = is_div<i,d>::value || is_prime_sub<i,d-1>::value };
};
template< int i >
struct is_prime_sub<i,2> {
    enum{ value = is_div<i,2>::value };
};

// iが素数かどうかを返す
template< int i >
struct is_prime {
    enum { value = ! is_prime_sub<i,i-1>::value };
};
template<>
struct is_prime<2> {
    enum { value = 1 };
};

// 条件分岐
template< int cond, typename trueT, typename falseT >
struct select {
    typedef trueT type;
};
template<typename trueT, typename falseT >
struct select< 0, trueT, falseT > {
    typedef falseT type;
};

// リストから素数でないものを取除く
template< typename ListT >
struct remove_not_prime {
};
template< typename firstT, typename secondT >
struct remove_not_prime< cell< firstT, secondT > > {
    typedef typename remove_not_prime< secondT >::type sec;
    typedef typename select< is_prime< firstT::value >::value, 
                             cell< firstT, sec >,
                             sec >::type type;
};
template< typename firstT >
struct remove_not_prime< cell< firstT, term > > {
    typedef typename select< is_prime< firstT::value >::value,
                             firstT,
                             term
                             >::type type;
};

// 指定範囲の素数のリストを生成する
template< int from, int to >
struct prime_list_gen {
    typedef typename remove_not_prime< typename list_gen<from,to>::type >::type type;
};

// メイン
int main( void ) {
    dump< prime_list_gen< 2, 100 >::type >::exec();
}


