Templates em C++ – Parte 1: Funções Template

por Fabio A. Mazzarino

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.