Listing 6
//Mult<UnitType,UnitType> -> UnitType
//Mult<UnitType,Typelist> -> Typelist
//Mult<Typelist,UnitType> -> Typelist
template<int C, class T1, class Tail1,
class H, class T2, class Tail2>
struct Mult<Typelist<Numlist<C,T1>,Tail1>,
Typelist<Typelist<H,T2>,Tail2> >
{
private:
typedef typename Mult<Typelist<H,T2>,Tail2>::Result temp;
public:
typedef typename TL::Append<
typename Mult<Numlist<C,T1>,temp>::Result,
typename Mult<Tail1,temp>::Result>::Result Result;
};
//the same specialization with exchanged template parameters
//i.e. Mult<Typelist<Typelist<..>,T1>,Typelist<Numlist<..>,T2> >
template<class H1, class T1, class Tail1,
class H2, class T2, class Tail2>
struct Mult<Typelist<Typelist<H1,T1>,Tail1>,
Typelist<Typelist<H2,T2>,Tail2> >
{
typedef typename Mult<
typename Mult<Typelist<H1,T1>,Typelist<H2,T2> >::Result,
typename Mult<Tail1,Tail2>::Result>::Result Result;
};