• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

Templates Em Cpp

Serr@no™

GF Ouro
Membro Inactivo
Entrou
Set 23, 2006
Mensagens
1,690
Gostos Recebidos
0
Os templates aplicam-se a funções e a classes e dão uma grande liberdade ao utilizador. Vejamos o seguinte caso:
// funções para somar dois valores


int soma( int a, int b )
{
return a+b;
}


double soma( double a, double b )
{
return a+b;
}


float soma( float a, float b )
{
return a+b;
}
O que fiz foi sobrecarga da função soma, para o compilador, apresar de terem todas o mesmo nome, são as três funções distintas, pois recebem parâmetros de diferente tipo. Bem, e que tal fazermos agora o mesmo para a multiplicação, divisão, e fazer o mesmo para parâmetros de tipos diferentes...
Em C haviam as macros, directivas do pré-processador com que se podia dar a volta a este problema. Em C++ existem os templates. Usando templates bastaria uma função para simbolizar todas as variantes de uma mesma função soma:
// função template para somar dois valores
template< typename T>
T soma( T a, T b )
{
return a+b;
}
O que estamos a dizer é que a função de template soma recebe dois parâmetros de um mesmo tipo T, que pode ser qualquer.
 

Serr@no™

GF Ouro
Membro Inactivo
Entrou
Set 23, 2006
Mensagens
1,690
Gostos Recebidos
0
Templates de Classe

Tal como se pode criar funções de template, também se pode criar templates de classes com uma sintaxe parecida. Para demonstrar um template de classes simularei um stack. Um stack é como uma pilha de papeis, vamos acrescentando, só dá para remover do topo e acrescentar ao topo.
template< typename T, unsigned DIM = 10 >
class Stack {
T data[DIM];
unsigned size; // tamanho do stack
public:
Stack() { size = 0; }
// retorna true se o stack estiver vazio
bool empty() const { return size==0; }
// retorna uma referência para o elemento no topo
T& top() { return data[size-1]; }
// acrescenta ao topo
void push( const T &p ) { data[size++] = p; }
// remover o ultimo
void pop() { --size; }
};
Esta classe é bastante limitada, como se pode ver, mas o objectivo é somente exemplificar um template de classes. Para declarar objectos desta classe faria-se Stack<int> Int_Stack; para um stack de inteiros com DIM= 10 por defeito ou Stack<unsigned,20> Unsigned_Stack; para um stack de unsigned com dimensão de 20 elementos.
Os métodos de um template de classes têm de ser sempre definido inline, de preferência no próprio ficheiro (.h), no ficheiro de exemplo mostro como isso se faz. Quando eu falar da STL (Standard Template Library), verificaremos toda a utilidade das templates.
 
Topo