Vocês já ouviram falar a respeito de metaprogramação com templates? Eu também não conhecia até começar a me preparar para uma das provas que iria fazer na universidade esses dias. Essa técnica traz a possibilidade de realizar computação em tempo de compilação usando o recurso de templates do C++. Alguns exemplos de cálculos possíveis são o fatorial e conversão de bases numéricas. Como isso funciona?
Uma das características poderosas do C++ é a possibilidade de criação de programas genéricos, através do uso de templates (o Java, entre outras linguagens, também tem esse recurso, com o nome de generics). Com eles, é possível desenvolver uma classe ou estrutura de dados genérica utilizando o tipo de dado que você necessitar facilmente. A Standard Template Library do C++ faz uso extensivo de templates.
Porém, os templates no C++ são muito flexíveis, podendo ser usados para definir muito mais do que apenas tipos de dados. A metaprogramação é feita através da definição de um template base e de sua instanciação. Acho que isso fica mais claro com um exemplo:
#include <iostream>
using namespace std;
template <int N> // Esta é a definição do template
struct Fatorial {
static const int valor = N * Fatorial<N - 1>::valor;
};
template <> // Esta é a definição do caso base
struct Fatorial<0> {
static const int valor = 1;
};
int main (int argc, char *argv[]) {
cout << Fatorial<5>::valor << endl;
cout << Fatorial<2>::valor << endl;
return 0;
}
E pronto, temos o fatorial calculado em tempo de compilação. Essa técnica, se usada intensivamente, pode aumentar consideravelmente o tempo de compilação, em compensação a uma melhora no tempo de execução, portanto é aconselhável cautela.
Interessante né? Mas nunca ouvi falar de ninguém ou algum projeto que a utilizasse. Dei uma folheada pelo Como programar em C++ do Deitel, 5ª edição, e não vi nada falando sobre isso. Fica como curiosidade!
Para saber mais: