Estou com dificuldades para entender a definição de templates. Meu entendimento básico é que as definições de templates permitem tornar o tipo de dados para retorno ou argumentos como genérico. Ou seja, um argumento de template é um tipo de dados para o qual o compilador instancia e vincula em tempo de compilação,
Mas não consigo entender definições complexas como as abaixo:
#include <iostream>
#include <type_traits>
template <unsigned n>
struct factorial : std::integral_constant<int,n * factorial<n-1>::value> {};
template <>
struct factorial<0> : std::integral_constant<int,1> {};
int main() {
std::cout << factorial<5>::value; // constexpr (no calculations on runtime)
return 0;
}
onde
template <class T, T v>
struct integral_constant {
static constexpr T value = v;
typedef T value_type;
typedef integral_constant<T,v> type;
constexpr operator T() { return v; }
};
Saída:
120
É realmente difícil visualizar como os modelos são instanciados:
template <int,5 * factorial<5-1>::value>
struct integral_constant {
static constexpr int value = 5 * factorial<5-1>::value;
typedef int value_type;
typedef integral_constant<5 * factorial<5-1>::value> type;
constexpr operator int() { return 5 * factorial<5-1>::value; }
};