Sunteți pe pagina 1din 6

PONTIFCIA UNIVERSIDADE CATLICA DE GOIS DEPARTAMENTO DE COMPUTAO CMP 1023 PROGRAMAO DE COMPUTADORES III PROFESSOR: JOS OLIMPIO

TEMPLATES

MARIANE MOREIRA BATISTA

Goinia Maio de 2012.

Introduo
Neste trabalho abordaremos o recurso Templates, que funciona como uma espcie de gabarito na programao.

Definio
Templates pode ser definido como um conjunto de classes ou funes parametrizadas. Os compiladores mais recentes de C++ permitem que os programadores definam funes genricas ou classes baseadas em argumentos que desconhecem o tipo. Esse tipo s ser definido quando forem usadas por entidades especficas.

Classe Templates
Uma classe template pode ser definida como uma famlia de classes que possuem estrutura semelhante. As maiores diferenas entre o uso de uma classe template e uma classe comum aparecem na implementao das rotinas fora do corpo da classe e na criao de objetos. Vejamos um exemplo: template <class T> class List { protected: T *v; int size; public: List(int); void Set(T v,int n); T Get(int n); }; template <class T> List<T>::List(int n) { v = new T[n]; size = n; } template <class T> void List<T>::Set(T val,int n) { if ((n>0)&&(n<size)) v[n] = val; } template <class T> T List<T>::Get(int n) { if ((n>0)&&(n<size)) return(v[n]); return(v[0]); }

void main() { List <int>vet(10); int r; for(r=0; r<10; r++) vet.Set(r*10,r); for(r=0; r<10; r++) cout << vet.Get(r) << "\n"; getch(); }

Funes Templates
Permite a criao de funes onde o tipo dos argumentos definido na hora da chamada da funo. Desta forma, com uma nica declarao, possvel definir uma famlia de funes sobrecarregadas com a vantagem que as mesmas s sero efetivamente "geradas" no caso de serem utilizadas. Segue abaixo exemplo: template <class T> void f1(T a,T b) { cout << "Soma: "<< (a+b) <<"\n"; } void main() { int a,b; float d,e; clrscr(); a = 10; b = 20; d = 50.3; e = 45.8; f1(a,b); f1(d,e); getch(); }

Declarao explcita de Funo Template


A funo template s ser implementada para inteiros quando o compilador encontrar uma chamada da funo que use inteiros. Caso deseje uma funo template, tenha uma verso para inteiros, para isto, declare explicitamente a funo para inteiros. Segue exemplo: int funo_template(int, int); Esta apenas a declarao da funo, sua definio ser dada automaticamente pelo compilador, tendo como base a definio de funo template.

Sobrecarga de Funo Template

Caso deseje uma funo que tenha o mesmo nome de uma funo j definida como template, mas que receba um nmero de parmetros diferente estar sobrecarregando a funo template. No entanto, o nmero de parmetros de entrada desta funo deve ser diferente do definido para a funo template, seno o compilador seno o compilador vai acusar ambigidade. Por exemplo: template<typename tipo> tipo f(tipo a, tipo b); template<typename tipo> tipo f(tipo a, tipo b, tipo c);

Especializao
Uma verso do template para um tipo em especial chamada de especializao. Existem dois tipos de especializaes a especializao completa ou explcita e a especializao parcial. Para toda especializao primeiramente preciso um template prim rio com o caso geral. Podemos pegar a funo template swap definida anteriormente para a template primria e gerar uma especializao completa para um tipo especfico. Por exemplo, uma especializao para o tipo int seria: template<> void swap(int & a, int & b) { cout << swap< int>() especialization\n; int temp( a); a = b; b = temp; } A especializao para int ser instanciada toda vez que o argumento for do tipo inteiro. Para os outros tipos o template primrio ser utilizado. A especializao completa usada para definir uma classe template para um nmero exato de argumentos. A especializao parcial uma especializao aonde voc necessita mais parmetros para definir a sua instncia do template. Neste caso a lista de parmetros no vazia. possvel criar uma especializao parcial para o caso de ponteiros, por exemplo, ou qualquer outro caso. Voltando ao exemplo da funo swap, ela ser usada aqui para a especializao para o tipo Array. Apenas para deixar clara a diferena, uma especializao completa para a classe Array poderia ser escrita assim: template< > void swap<Array<int> & a, Array<int> & b> {

[] } Neste caso a especializao completa s funcionaria para o caso de um Array<int>. Para resolver a especializao para qualquer Array de tipo T, pode ser usada a especializao parcial. Ficando assim: template< class T > void swap( Array<T> & a, Array<T> & b ) { a.swap(b); } aonde Array::swap poderia ser definida assim: void Array< T >::swap( Array<T> & b ) { T * tmp( m_pointer); m_pointer = b.m_pPointer; b.m_pointer = tmp; } Agora a funo swap pode ser usada em qualquer Array e a especializao tornou a funo muito mais eficiente e segura para o caso da classe Array, aonde uma simples cpia do ponteiro resolve o problema. Caso o template primrio fosse usado seria muito mais dispendioso criar uma cpia da classe para fazer o swap. Este fator foi o que tornou interessante esta especializao parcial.

Concluso
Templates tambm podem ser vistos como uma alternativa sobrecarga de funes, quando estas envolvem lgicas de programas e operaes idnticas para vrios tipos de dados. Com o uso de templates, o programador pode implementar um nico cdigo para uma determinada funo. Eles tambm podem ser usados para criar gabaritos de classe (classes genricas). Mas como o compilador gera automicamente o cdigo quando a palavra-chave template encontrada, os mtodos devem ser implementados no arquivo de cabealho.Conforme ditto anteriormente, podemos definir Templates como gabarito.

Blibiografia
S. LIPPMAN, J. Lajoie, C++ Primer (3rd edition), Addison-Wesley, 1998 Bjarne Stroustrup, The C++ Programming Language STEPHEN C. Dewhurst, C++ Common Knowledge

SOULI, J. CPP Tutorial. Disponvel em: http: / / www.cplusplus.com / doc / tutorial / BUENO, A. D., Apostila de Programao Orientada a Objeto em C++. Disponvel em: http: / / www.apostilando.com / download.php?cod=283&categoria=C%20e %20C++

S-ar putea să vă placă și