Listing 10

template<class TList, unsigned short Var> struct Differentiate;
template<unsigned short Var>
struct Differentiate<NullType,Var>
{
   typedef NullType Result;
};
template<class NList, class Tail, unsigned short Var>
struct Differentiate<Typelist<NList,Tail>,Var>
{
private:
   enum {  pow = NL::NumAt<NList,Var>::value };
   typedef typename Differentiate<Tail,Var>::Result next;
public:
   typedef typename Loki::Select<pow==0,next,
           Typelist<typename NL::AddAt<
                    typename NL::MultAt<NList,0,pow>
               ::Result,Var,-1>::Result,next> >::Result Result;
};