Templates
template <typename T> permite que uma function funcione com um type decidido no ponto de chamada, não quando é escrita. Diferente dos generics trait-bounded do Rust, um template C++ é duck-typed: o compilador só precisa que as operações que você realmente usa dentro do corpo da function (aqui, > e copiar) sejam válidas para o que quer que T acabe sendo.
#include <iostream>
using namespace std;
template <typename T>
T maxOf(T a, T b) {
return (a > b) ? a : b;
}
int main() {
cout << maxOf(3, 7) << endl;
cout << maxOf(2.5, 1.5) << endl;
return 0;
}7 2.5
Class templates
Uma class também pode ser templated — Box<T> abaixo funciona para qualquer type T, com o type específico preenchido onde quer que a class seja usada, como Box<int> ou Box<string>.
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Box {
private:
T value;
public:
Box(T v) : value(v) {}
T getValue() const {
return value;
}
};
int main() {
Box<int> intBox(42);
Box<string> strBox("hello");
cout << intBox.getValue() << endl;
cout << strBox.getValue() << endl;
return 0;
}42 hello
A seguir: STL containers e iterators — std::map, std::set, e como iterar qualquer container da mesma forma.
Practice exercise
Escreva uma function template first<T>(T a, T b) que retorne a, depois chame first(10, 20) e imprima o resultado.