sábado, 27 de março de 2010

Metaprogramação com templates em C++

Conhecimento é poderImagem retirada do Danbooru (contém conteúdo NSFW)
Artista: ushi


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:

Nenhum comentário:

Postar um comentário