AnyCompiler

Templates

template <typename T> permite que una función funcione con un type decidido en el punto de llamada, no cuando se escribe. A diferencia de los generics trait-bounded de Rust, un template de C++ es duck-typed: el compilador solo necesita que las operaciones que realmente usas dentro del cuerpo de la función (aquí, > y copiar) sean válidas para lo que sea que resulte ser T.

#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;
}
Output
7
2.5

Class templates

Una class también puede ser templated — Box<T> de abajo funciona para cualquier type T, con el type específico completado dondequiera que se use la class, como Box<int> o 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;
}
Output
42
hello

Siguiente: STL containers e iterators — std::map, std::set, y cómo iterar cualquier container de la misma manera.

Practice exercise

Escribe una función template first<T>(T a, T b) que devuelva a, luego llama a first(10, 20) e imprime el resultado.