Fácil C++
Maior de dois valores
Enunciado
Crie um template de função maior que recebe dois valores de qualquer tipo e retorna o maior deles. Use template<typename T>. No main, chame a função com int, double e std::string e imprima os resultados.
Requisitos
- A função deve ser um template com
template<typename T>. - Deve comparar os dois argumentos com
>e retornar o maior. - O
maindeve chamar a função com pelo menos três tipos diferentes. - A saída deve mostrar os três resultados.
Código inicial
#include <iostream>
#include <string>
// TODO: implemente o template maior
int main() {
// TODO: chame maior com int, double e string
return 0;
}
Saída esperada
7
3.14
banana
Ver dica
O corpo da função é simplesmente return (a > b) ? a : b;. O compilador deduz T a partir dos argumentos.
Mostrar solução
#include <iostream>
#include <string>
// Template genérico: retorna o maior entre dois valores
template<typename T>
T maior(T a, T b) {
return (a > b) ? a : b;
}
int main() {
// Dedução: T = int
std::cout << maior(3, 7) << '\n';
// Dedução: T = double
std::cout << maior(2.71, 3.14) << '\n';
// Dedução: T = std::string (comparação lexicográfica)
std::cout << maior(std::string("banana"), std::string("abacaxi")) << '\n';
return 0;
}
Passo a passo
- Incluímos
<iostream>e<string>para entrada/saída e para o tipostd::string. - Declaramos
template<typename T>antes da função, indicando queTé um parâmetro de tipo genérico. - A função
maiorrecebe dois parâmetros do tipoTe retornaT. O corpo usa o operador ternário para escolher o maior. - No
main, a primeira chamadamaior(3, 7)faz o compilador deduzirT = inte instanciar a função paraint. - A segunda chamada
maior(2.71, 3.14)deduzT = doublee instancia outra versão. - A terceira chamada usa
std::string; o compilador deduzT = std::stringe instancia a versão que compara strings lexicograficamente. - Cada instanciação é uma função independente gerada em tempo de compilação.
Por que funciona
Templates de função permitem que o mesmo código seja reutilizado para vários tipos. O compilador analisa os tipos dos argumentos e gera automaticamente a versão correta da função — isso é a dedução de tipos seguida de instanciação. Como a comparação > está definida para int, double e std::string, o template compila para todos eles.
Erros comuns
- Esquecer
template<typename T>antes da função: o compilador não reconheceTe gera erro. - Passar tipos diferentes, como
maior(3, 4.5): a dedução falha porqueTnão pode serintedoubleao mesmo tempo. Nesse caso, usemaior<double>(3, 4.5)para forçar a instanciação. - Usar tipos que não suportam
>(ex.: uma struct semoperator>): o erro só aparece na instanciação, com mensagem de compilação detalhada.
Outra forma de resolver
Se quiser aceitar tipos diferentes, pode usar dois parâmetros de tipo:
template<typename T, typename U>
auto maior(T a, U b) -> decltype(a > b ? a : b) {
return (a > b) ? a : b;
}
Isso é útil quando os argumentos têm tipos distintos, mas exige cuidado com o tipo de retorno.
Saída esperada
7
3.14
banana