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 } ;
} ;