Listing 3: The unrolled logarithmic power algorithm

template<int exp, typename T>
inline T UnrolledPower(const T& base) { 
  if( 0 == exp )
    return T(1);
  else if( 1 == exp )
    return base;
  else {
    T ret = UnrolledPowerInternal<exp>(base);
    return (exp % 2) ? ret * base : ret;
  }
} 

template<int exp, typename T>
inline T UnrolledPowerInternal(const T& x) { 
  if( 1 == exp/2 )
    return x * x;
  else if( (exp/2) % 2 )
    return UnrolledPowerInternal<exp/2>(x * x) * x;
  else
    return UnrolledPowerInternal<exp/2>(x * x);
}