#include #include // Эта фишка называется метапрограммирование =) // определяем шаблонный класс template class Factorial { public: // инициализация константы по стандарту должна выполняться на этапе компиляции static const long long VAL = Factorial<_N - 1>::VAL * _N; }; // это конкретная специализация шаблона template <> struct Factorial<0> { static const long long VAL = 1; }; // функция - чисто для удобства template long long GetFactorial() { return Factorial<_N>::VAL; } int main() { std::cout << "Factorial of 20: " << GetFactorial<20>() << std::endl; return EXIT_SUCCESS; }