Listing 4

template<class List1, class List2> struct Mult;
//simple implementation of the operations:
//Mult<NullType,NullType> -> NullType
//Mult<NullType,Numlist> -> NullType
//Mult<Numlist,NullType> -> NullType
//Mult<NullType,Typelist> -> NullType
//Mult<Typelist,NullType> -> NullType
template<int Coef1, class Tail1, int Coef2, class Tail2>
struct Mult<Numlist<Coef1,Tail1>,Numlist<Coef2,Tail2> >
{
   typedef Typelist<Numlist<Coef1*Coef2,
           typename Add<Tail1,Tail2>::Result>,NullType> Result;
};
template<int C1, class T1, int C2, class T2, class Tail>
struct Mult<Numlist<C1,T1>, Typelist<Numlist<C2,T2>,Tail> >
{
   typedef typename TL::Append<
           typename Mult<Numlist<C1,T1>,
                         Numlist<C2,T2> >::Result,
           typename Mult<Numlist<C1,T1>,Tail>::Result
                               >::Result Result;
};
//the same specialization with exchanged template parameters,
//i.e. Mult<Typelist<Numlist<C1,T1>,Tail>,Numlist<C2,T2> >
template<int C1, class T1, class Tail1,
         int C2, class T2, class Tail2>
struct Mult<Typelist<Numlist<C1,T1>,Tail1>,
            Typelist<Numlist<C2,T2>,Tail2> >
{
private:
   typedef Numlist<C1,T1> Head1;
   typedef Numlist<C2,T2> Head2;
public:
   typedef typename TL::Append<
           typename TL::Append<
           typename TL::Append<
           typename Mult<Head1,Head2>::Result,
           typename Mult<Head1,Tail2>::Result>::Result,
           typename Mult<Tail1,Head2>::Result>::Result,
           typename Mult<Tail1,Tail2>::Result>::Result Result;
};