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