I was asked a question about calculate the Fibonacci number at the compile time not at run time in C++.

Initially, I have no idea about how to solve this problem, how to make the calculation happen in the compile time? Then the key solution is: Using Template.

**Template metaprogramming **can make compile-time class generation, and also can perform polymorphism in a static, which is well-known as the Curiously Recurring Template Pattern (CRTP).

So the solution is listed as following:

template<int N> class Fibonacci { public: enum { value = Fibonacci<N-1>::value + Fibonacci<N-2>::value }; }; template<> class Fibonacci<1> { public: enum { value = 1 }; }; template<> class Fibonacci<0> { public: enum { value = 0 }; }; int main() { int i = Fibonacci<6>::value; return i; }

Compile it to assembly “`g++ -O2 -S Fibonacci_template.cpp`

”

_main: ## @main .cfi_startproc ## BB#0: pushq %rbp Ltmp0: .cfi_def_cfa_offset 16 Ltmp1: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp2: .cfi_def_cfa_register %rbp movl $8, %eax popq %rbp retq .cfi_endproc

You can find: The assembly output (**Line 12**) is compiled into the exact number of `Fibonacci(6)`

is to be **8**.