Listing 1: DumbPower unrolled

template<int exp>
class ExpTag{};

template<int exp, typename T>
inline T UnrolledDumbPower(const T& base) { 
  return UnrolledDumbPowerInternal(base, ExpTag<exp>());
}

template<int exp, typename T>
inline T UnrolledDumbPowerInternal(
  const T& base, ExpTag<exp>) { 
  return UnrolledDumbPowerInternal(
    base, ExpTag<exp-1>()) * base; 
}

template<typename T>
inline T UnrolledDumbPowerInternal(
  const T& base, ExpTag<1>)
{ return base; }

template<typename T>
inline T UnrolledDumbPowerInternal(const T&, ExpTag<0>)
{ return T(1); }