Templates em C++

Postado por Yoshio Iwamoto em 16/07/2007

Uma das coisas mais estranhas do C++ pra mim são os templates, a sua sintaxe não é lá muito intuitiva (mas já vi coisas piores). Mas os templates são importantes, na verdade foram graças aos templates em C++ que a programação genérica se fortaleceu.

Um template lembra um define, só que bem mais “parrudo” e seguro. Imagine que você tenha duas funções que some dois números cada, a primeira função serve para somar dois números inteiros e a segunda soma dois números de ponto flutuante.

  1. int soma_int(int a, int b)
  2. {
  3. return (a + b);
  4. }
  5.  
  6. float soma_float(float a, float b)
  7. {
  8. return (a + b);
  9. }
  10.  
  11. soma_int(10, 20); // retorna 30
  12. soma_float(10.12, 20.34); // retorna 30.46


Com os templates é possível criar uma única função que some estes números mesmo que sejam de tipos diferentes de dados.
Basicamente para se criar uma função template é preciso ter a seguinte sintaxe:

template <class identificador> declaração_da_função;

Utilizando o template no código anterior ele ficaria assim:

  1. template <class T>
  2. T soma(T a, T b)
  3. {
  4. return (a + b);
  5. }
  6.  
  7. soma<int> (10, 20) // retorna 30
  8. soma<float> (10.12, 20.34); // retorna 30.46


O código ficou menor, pois eu só precisei criar uma função. Com uma explicação bem tosca eu poderia dizer que o compilador troca todos os "T" da função template pelo que estiver entre os sinais de maior e menor na hora que você chama a função (soma<int>, soma<float>). É parecido com o define, porém os templates possuem checagem de tipagem de dados, são bem mais versáteis e evitam que se cometam erros bobos com o uso de defines em excesso.

Se os parâmetros da função são de apenas 1 tipo não é necessário especificar com o <int> ou <float>, o compilador já deduz o tipo:

  1. soma(10, 20) // OK, os dois parâmetros são int
  2. soma(10.12, 20.34); // OK, os dois parâmetros são float
  3. soma(10, 20.34) // ERROR, os dois parâmetros são de tipos diferentes


Você também pode especificar mais tipos para o template:

  1. template <class TValue, class TPercent, class TReturn>
  2. TReturn get_percentage(TValue value, TPercent percentage)
  3. {
  4. return (TReturn)(value * (percentage / 100.0));
  5. }
  6.  
  7. get_percentage<int, float, int>(1000, 80.33) // retorna 80.33% de 1000 como int (803)
  8. get_percentage<int, float, float>(1000, 80.33) // retorna 80.33% de 1000 como float (803.3)


Para deixar claro: "função<tipo1, tipo2, tipoN> (...);" corresponde a "template <class tipo1, class tipo2, class tipoN...> função(...);".

É possível utilizar os templates em classes também:

  1. template <class T>
  2. class my_class
  3. {
  4. private:
  5. T attr;
  6. public:
  7. my_class (T value)
  8. {
  9. attr = value;
  10. }
  11. };
  12.  
  13. my_class<int> object(1); // instânciando


Fiz uma explicação bem simples sobre o uso de templates, mas existem mais coisas que você deve aprender jovem Padawan. Recomendo uma lida aqui cplusplus.com e aqui Universal Knowledge Center About Everything.

2 Comentário para “Templates em C++”

  1. esginados1 disse em 16/07/2007 as 11:12

    muito bom

  2. Ronaldo disse em 16/07/2007 as 14:24

    Cara eu nunca tinha entendido os templates, mas graças ao teu artigo foi bem fácil, valeu mesmo!

Trackback URI |

Av. Conselheiro Nébias, 368A, Cj. 413
Vila Mathias - Santos - SP
Telefone: (13) 3345-4580

© 2008 - 2009 Stiod. Todos os direitos reservados.