ちなみにこういうのはコンパイルが通らない。

template <typename T, T A, int N>
struct Power {
enum T { Value = Power<T, A, N - 1>::Value * A };
};

template <typename T, T A>
struct Power <T, A, 1>{
enum T { Value = A };
};

int main()
{
std::cout << Power<double, 5, 3>::Value << std::endl;
}