Listing 12

template<class TList> struct Expand;
template<class H, class T, class Tail>
struct Expand<Typelist<Typelist<H,T>,Tail> >
{
   typedef typename Mult<Typelist<H,T>,Tail>::Result Result;
};

typedef ShapeFunction3<2,2,NUMLIST_2(0,0)> sf1;
typedef ShapeFunction3<2,2,NUMLIST_2(0,1)> sf2;
typedef Simplify<Expand<sf1::Result>::Result>::Result f1;
typedef Simplify<Expand<sf2::Result>::Result>::Result f2;
typedef Integrate3<Mult<Differentiate<f1,1>::Result,
                   Differentiate<f2,1>::Result>::Result> in1;
typedef Integrate3<Mult<Differentiate<f1,2>::Result,
                   Differentiate<f2,2>::Result>::Result> in2;
std::cout<<in1::val()/(sf1::denom*sf2::denom)
          +in2::val()/(sf1::denom*sf2::denom);