Num artigo anterior, falei da classe template em C++. Agora, vou abordar as funções template. De forma análoga a uma classe template, uma função template permite definir uma função em que o valor de retorno e/ou os parâmetros sejam de um tipo genérico. Ainda, o seu código também só será gerado pelo compilador, quando este encontra utilizações destas funções.
Para fazer um paralelismo com a classe template do artigo anterior, vamos agora ver duas funções que recebem dois valores de tipo genérico e, uma devolve qual o valor maior (max) e a outra devolve qual o valor menor (min).
Vamos começar por ver a função “max”:
template <typename T> T max(T &val1, T &val2) { return (val1 > val2 ? val1 : val2); }
Na declaração “template <typename T>” na primeira linha, estamos a indicar ao compilador que vamos usar um template com um tipo de dados genérico “T“. Esse “T” é usado como retorno da função e como parâmetros (val1 e val2), como vemos na segunda linha. Ainda, de notar o uso do símbolo “&” nos parâmetros. Isto porque, numa função “template” devemos indicar, nos parâmetros, se pretendemos um endereço de uma variável ou um apontador. Caso não o façamos, ao evocar esta função, passando uma variável, o compilador irá dar um erro a dizer que a chamada da função é ambígua.
Vejamos um exemplo, assumindo que temos duas variáveis inteiras, i1 e i2:
cout << "O inteiro maior é: " << max(i1, i2) << endl;
Vamos ver agora a função “min”:
template <typename T> T min(T &val1, T &val2) { return (val1 < val2 ? val1 : val2); }
De forma semelhante à função “max”, voltamos a indicar que estamos perante um template com um tipo genérico “T”. Vejamos como evocar a função com os inteiros i1 e i2:
cout << "O inteiro menor é: " << min(i1, i2) << endl;
O seguinte programa completo utiliza três tipos de dados diferentes para as funções “max” e “min”:
#include <iostream> #include <stdlib.h> #include <string> using namespace std; template <typename T> T max(T &val1, T &val2) { return (val1 > val2 ? val1 : val2); } template <typename T> T min(T &val1, T &val2) { return (val1 < val2 ? val1 : val2); } int main() { int i1, i2; float f1, f2; string s1, s2; cout << "Introduza dois valores inteiros:" << endl; cin >> i1; cin >> i2; cout << "O inteiro maior é: " << max(i1, i2) << endl; cout << "O inteiro menor é: " << min(i1, i2) << endl; cout << "Introduza dois valores do tipo float:" << endl; cin >> f1; cin >> f2; cout << "O float maior é: " << max(f1, f2) << endl; cout << "O float menor é: " << min(f1, f2) << endl; cout << "Introduza 2 strings:" << endl; cin >> s1; cin >> s2; cout << "A string maior é: " << max(s1, s2) << endl; cout << "A string menor é: " << min(s1, s2) << endl; }
Exemplo da execução do programa:
120
90
O inteiro maior é: 120
O inteiro menor é: 90
Introduza dois valores do tipo float:
14.5
22.6
O float maior é: 22.6
O float menor é: 14.5
Introduza 2 strings:
def
abc
A string maior é: def
A string menor é: abc
Siga-nos nas redes sociais e esteja a par das nossas novidades no nosso blogue multi-temático Out4Mind!
Este artigo foi escrito de acordo com a antiga grafia.