10.12
2020
Templates vieram para flexibilizar a tipagem forte da linguagem C++ sem a utilização de tipos neutros, como void, comum em C++. Neste post vamos aprender como implementar uma função com templates.
Funções Template
Vamos começar implementando uma função genérica. Uma função que faz swap do conteúdo de duas variáveis.
#include <iostream>
#include <string>
template <class X>
void swap(X &a, X &b) {
X tmp;
tmp = a;
a = b;
b = tmp;
}
int main() {
int ia = 1;
int ib = 2;
std::cout << "before: " << ia << ", " << ib << std::endl;
swap<int>(ia, ib);
std::cout << "after: " << ia << ", " << ib << std::endl;
double da = 1.5;
double db = 2.9;
std::cout << "before: " << da << ", " << db << std::endl;
swap<double>(da, db);
std::cout << "after: " << da << ", " << db << std::endl;
std::string sa = "sa";
std::string sb = "sb";
std::cout << "before: " << sa << ", " << sb << std::endl;
swap<double>(da, db);
std::cout << "after: " << sa << ", " << sb << std::endl;
}
No começo do código é possível ver como uma função template é declarada, utilizando template<class type>. Na função main() como efetuar a chamada de uma função template, com swap<type>. O código acima vai entregar a seguinte saída:
before: 1, 2
after: 2, 1
before: 1.5, 2.9
after: 2.9, 1.5
before: sa, sb
after: sa, sb
Caso seja necessário mais de um tipo:
#include <iostream>
#include <sstream>
template <class X, class Y>
std::string concatstring(X a, Y b) {
std::stringstream ss;
ss << a << b;
return ss.str();
}
int main() {
std::cout << concatstring<const char*, int>("abc", 123) << std::endl;
std::cout << concatstring<double, char>(123.4, 'd') << std::endl;
}
Que entregará a saída:
abc123
123.4d
No próximo post vamos aprender a fazer uma classe template.