#include <iostream>

using namespace std;

template <int N> struct Factorial {
    enum {
        value = N * Factorial<N - 1>::value
    };
};
 
template <> struct Factorial<0> {
    enum { value = 1 };
};
 
// Factorial<4>::value == 24
// Factorial<0>::value == 1

int main()
{
    cout << Factorial<4>::value << endl;

    return 0;
}
