Listing 6
// Improved prime number generator with debugging code included.
template<int P, int I = 2> struct CIsPrime
{
struct NotPrime
{
enum { result = false } ;
} ;
struct FindNextPrime
{
enum { result = CIsPrime<P, I + 1>::result } ;
} ;
typedef typename CIfThenElse<(P % I) ==
0, NotPrime, FindNextPrime>::Result R;
enum { result = ( P == 2 ) || R::result } ;
typedef CIsPrime<P, I> This;
static CMetaProgramDebug<This> m_debug;
} ;
template<int P, int I> CMetaProgramDebug<CIsPrime<P, I> >
CIsPrime<P, I>::m_debug;
template<int P> struct CIsPrime<P, P>
{
enum { result = true } ;
} ;