Ir para conteúdo
Faça parte da equipe! (2024) ×
Conheça nossa Beta Zone! Novas áreas a caminho! ×
  • Quem está por aqui   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.

templates (gabarito)


_Guguinha_
 Compartilhar

Posts Recomendados

Bem pessoal, venho através deste tópico poder ensinar a algumas pessoas que ingressaram no C++ como usar tamplates!

 

Suponha que vc quer escrever uma função que percorre um vetor e simultaneamente procura o máximo e o mínimo:

 

É necessário se cadastrar para acessar o conteúdo.

 

Para retornar ambos os valores, crie uma classe simples Pair (Par).

 

É necessário se cadastrar para acessar o conteúdo.

 

Agora vc pode completar a função como segue:

 

É necessário se cadastrar para acessar o conteúdo.

 

 

O invocador da função recupera ambos os valores como segue:

 

É necessário se cadastrar para acessar o conteúdo.

 

Entretando, a classe Par não é muito flexível. Suponha que você quer reunir alguns valores double ou string. Então vc precisa definir outra classe. O que é realmente necessário é um mecanismo para definir pares de tipos arbitrários. Para esta finalidade, vc pode definir um gabarito de classe, que pode produzir pares de tipos particulares. O gabarito pode ser instanciado como classes Pair<int>, Pair<string> e assim sucessivamente. Vc pode pensar no gabarito Pair como uma fábrica de classes, e uma classe instanciada tal como Pair<int> como sendo uma classe produzidapor esta fábrica.

Para definir o gabarito, indique o tipo arbitrário com um parâmetro de tipo T. Substitua todos os tipos int pela variável de tipo T; Finalmente, adicione uma linha template<typename T> antes da definição da classe:

 

É necessário se cadastrar para acessar o conteúdo.

 

Com compiladores antigos, vc deve usar template<class T> em vez de template<typename T>. O C++ padrão permite ambas as escolhas, typename é preferido porque torna claro e evidente que T pode ser de qualquer tipo, e não apenas uma classe. Por exemplo, vc pode formar um Pair<int>, mesmo que int ñ seja um tipo de classe.

 

Finalmente, vc deve transformar cada definição de função membro em um gabarito, como mostrado abaixo:

 

É necessário se cadastrar para acessar o conteúdo.

 

Note que cada função é tranformada em um gabarito separado. Cada nome de função é prefixado pelo qualificador "Pair<T>::". E, naturalemnte, a variável T é usada em lugar do tipo int.

Pessoal, o gabarito Pair é um exemplo simples que foi apresentado com propósito de demonsteação (na realidade, existe um gabarito pair na biblioteca padrão de C++ que é similiar a este gabarito).

O uso mais comum de gabaritos é nas classes contêiners. Naturalmente, as construções padrão vector e list são um bom exemplo de gabaritos.

 

Ah, pessoal, e para enriquecer mais o post que eu fiz, vou dar mais um forte exemplo de gabaritos (templates).

 

Se lembra do gabarito list que eu citei logo a alguma linhas atrás? Vou dar um exemplo de uma aplicação que usa a mesma:

 

É necessário se cadastrar para acessar o conteúdo.

 

Observem que neste caso ela esta usando o tipo string, mas eu poderia usar os tipos, int, double, float, etc, graças ao gabarito!

 

Um amigo meu (A pedido dele, não vou divulgar o seu nome e nick), que se dedicou em estudar os gabaritos, criou a própria classe list dele, e acho que vai ser um grande exemplo para todos divulgar o source, o código abaixo é a obra dele, o exemplo que eu dei logo acima baseou-se no programa que ele fez hehehe!

 

Os únicos problemas são:

1º Não está comentado, mas, em breve vou editar o post e vou comentar, aguardem =D

2º Ele deveria estar fragmentado em arquivos diferentes, mas a obra ñ é minha mesmo xD,

3º Está uma coisa de louco hehehe

 

É necessário se cadastrar para acessar o conteúdo.

 

OBS: Não compilei o código!

 

Existe uma ligeria diferença entre o gabarito List que meu amigo definiu e o gabarito list padrão de C++. Com o gabarito dele, vc define um iterador assim:

 

É necessário se cadastrar para acessar o conteúdo.

 

Entretanto, com a class list padrão, vc usa uma sintaxe levemente diferente:

 

É necessário se cadastrar para acessar o conteúdo.

 

O que faz esta diferança é que, na biblioteca padrão, a classe iterator é aninhada dentro da classe list!

 

Classes aninhadas poderá ser o próximo tutorial que vou desenvolver, até lá, bons estudos à todos!

 

 

bye :lol:

Link para o comentário
Compartilhar em outros sites

Este tópico está impedido de receber novos posts.
 Compartilhar

×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.