include cstdlib include iostream Эта фишка называется метапрограммиров

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <cstdlib>
#include <iostream>
// Эта фишка называется метапрограммирование =)
// определяем шаблонный класс
template <int _N>
class Factorial
{
public:
// инициализация константы по стандарту должна выполняться на этапе компиляции
static const long long VAL = Factorial<_N - 1>::VAL * _N;
};
// это конкретная специализация шаблона
template <> struct Factorial<0> { static const long long VAL = 1; };
// функция - чисто для удобства
template <int _N>
long long GetFactorial()
{
return Factorial<_N>::VAL;
}
int main()
{
std::cout << "Factorial of 20: " << GetFactorial<20>() << std::endl;
return EXIT_SUCCESS;
}