Listing 11

template<class NList, unsigned short Len=0>
struct IntegrateTerm3;
template<unsigned short Len>
struct IntegrateTerm3<NL::NullType,Len>
{
   enum { numerator=1, denominator=Len };
};
template<int Num, class Tail, unsigned short Len>
struct IntegrateTerm3<Numlist<Num,Tail>,Len>
{
private:
   typedef IntegrateTerm3<Tail,Len+1> temp;
public:

   enum { numerator = Factorial<Num>::value * temp::numerator,
          denominator = Num + temp::denominator };
};
template<class TList> struct Integrate3;
template<>
struct Integrate3<Loki::NullType>
{
   inline static double val()  {  return 0; }
};
template<int Num, class T, class Tail>
struct Integrate3<Typelist<Numlist<Num,T>,Tail> >
{
private:
   typedef IntegrateTerm3<T> iterm;
public:
   inline static double val()
   {  return Num*iterm::numerator
             /(double)Factorial<iterm::denominator>::value
             + Integrate3<Tail>::val();
   }
};