// Máximo genérico con un template: el tipo se comprueba y se genera una versión por tipo.
#include <cassert>
#include <cstddef>
#include <iostream>
#include <string>
#include <vector>

template <typename T>
const T& max_of(const std::vector<T>& items) {
    assert(!items.empty());
    const T* best = &items[0];
    for (std::size_t i = 1; i < items.size(); i++) {
        if (items[i] > *best) {
            best = &items[i];
        }
    }
    return *best;
}

int main() {
    std::vector<int> numbers{3, 9, 4};
    std::vector<std::string> names{"Ana", "Zoila", "Beto"};
    std::cout << max_of(numbers) << "\n";
    std::cout << max_of(names) << "\n";
    return 0;
}
