Listing 9

template<unsigned short Dim, unsigned short Order, class NList,
         unsigned short N=1, unsigned short Sum=0>
struct ShapeFunction3;
template<unsigned short Dim, unsigned short Order,
         unsigned short N, unsigned short Sum>
truct ShapeFunction3<Dim,Order,NL::NullType,N,Sum>
{
   enum { denom = Factorial<Order-Sum>::value };
   typedef typename BasicList3<Dim,Order,Order-Sum>
                                      ::Result Result;
};
template<unsigned short Dim, unsigned short Order,
    int Num, class Tail, unsigned short N, unsigned short Sum>
struct ShapeFunction3<Dim,Order,Numlist<Num,Tail>,N,Sum>
{
private:
   typedef ShapeFunction3<Dim,Order,Tail,N+1,Sum+Num> temp;
public:
   enum { denom = Factorial<Num>::value * temp::denom };
   typedef typename TL::Append<
           typename ShapeBasis<Dim,Order,N,Num>::Result,
           typename temp::Result>::Result Result;
};