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