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); }