Programar em C++/Templates

De Wikibooks

Esta página precisa ser reciclada (discuta).
Ao melhorá-la, você estará ajudando o Wikilivros.


Os templates permitem a criação de código re-usado, usando templates é possível criar funções e classes genéricas. Assim a tipologia de dados usadas pelas funções são parâmetros. Podemos criar um template para soma, e depois enviamos que tipo de dados queremos somar, podemos até utilizar a sobrecarga de operadores para tal fim.



[editar] funções genéricas

template <class Ttype> ret-type func-name(parameter list)
{
// body of function
}

vamos dar o exemplo

// Function template example.
#include <iostream>
using namespace std;
template <class X> void swapargs(X &a, X &b)// This is a function template.
   {
       X temp;
       temp = a;
       a = b;
       b = temp;
   }
int main()
{
   int i=10, j=20;
   double x=10.1, y=23.3;
   char a='x', b='z';
   cout << "Original i, j: " << i << ' ' << j << '\n';
   cout << "Original x, y: " << x << ' ' << y << '\n';
   cout << "Original a, b: " << a << ' ' << b << '\n';
   swapargs(i, j); // swap integers
   swapargs(x, y); // swap floats
   swapargs(a, b); // swap chars
   cout << "Swapped i, j: " << i << ' ' << j << '\n';
   cout << "Swapped x, y: " << x << ' ' << y << '\n';
   cout << "Swapped a, b: " << a << ' ' << b << '\n';
   system ("pause");
   return 0;
}

aqui criamos uma template para uma função que troca os valores, e essa função pode ser usada quer tendo ints, doubles ou chars. nós utilizamos o X como data type. neste caso temos swapargs() como uma função genérica. o compilador automaticamente cria 3 versões para a função swapargs(). portanto os templates não são bem funções que funcionam para as várias tipologias mas antes os templates permitem poupar escrita ao programador para não ter de especificar cada tipologia.

template function ou genéric function (é uma definição de uma função precedida pela statement template

especialização == é quando o compilador cria a versão especifica da função. também é chamada de generated function. o acto de gerar a função é referido como instantiating.

há quem prefira ter a declaração do template da seguinte forma

template <class X> 
void swapargs(X &a, X &b)// This is a function template.
   {
       X temp;
       temp = a;
       a = b;
       b = temp;
   }

o que se torna bem parecido com o modelo utilizado anteriormente


uma função com dois tipos genéricos.

#include <iostream>
using namespace std;
template <class type1, class type2>
   void myfunc(type1 x, type2 y)
           {
           cout << x << ' ' << y << '\n';
           }
int main()
{
   myfunc(10, "hi");
   myfunc(0.23, 10L);
   system ("pause");
   return 0;
}


repare que temos duas tipologias de dados diferentes na mesma função

[editar] Explicitly overloading a generic function

apesar de uma função genérica poder ser overload automaticamente se necessário, nós podemos explicitar. a isso chamamos deexplicit specialization





Ferramentas pessoais
Criar um livro
  • Adicionar página wiki
  • Ajuda de colecções