Listing 3


template <class T, u32 N, 
  class MajNListT, class MinNListT>
struct DetEvaluator
{
  enum { 
    eMinListIdx = 
      NL::Length<MinNListT>::value - 1,
  };

  static T
  Evaluate(const VectT majors[N])
  { 
    return CofactorRecursor<
      T,N,eMinListIdx, MajNListT, MinNListT
    >::Evaluate(majors); 
  }
};


template <class T, u32 N, 
  s32 MajIdxN, s32 MinIdxN>
struct DetEvaluator<
  T, N, 
  NL::Numlist<MajIdxN, NL::NullType>,
  NL::Numlist<MinIdxN, NL::NullType>
>
{
  static T
  Evaluate(const VectT majors[N])
    { return majors[MajIdxN][MinIdxN]; }
};