Médio C++
Lambda genérica que imprime qualquer tipo
Enunciado
Crie uma lambda genérica que receba um parâmetro auto e imprima esse valor seguido de uma quebra de linha. Chame a lambda com um int, um double e uma std::string.
Requisitos
- A lambda deve usar
autono parâmetro. - A lambda deve imprimir o valor recebido.
- O programa deve chamar a lambda com três tipos diferentes.
Código inicial
#include <iostream>
#include <string>
int main() {
// Crie a lambda genérica aqui
return 0;
}
Saída esperada
42
3.14
Olá
Ver dica
Use [](const auto& valor) { std::cout << valor << '\n'; } e chame com diferentes tipos.
Mostrar solução
#include <iostream>
#include <string>
int main() {
// Lambda genérica: 'auto' permite qualquer tipo
auto imprime = [](const auto& valor) {
std::cout << valor << '\n';
};
imprime(42);
imprime(3.14);
imprime(std::string("Olá"));
return 0;
}
Passo a passo
- A lambda
imprimeé declarada com[](const auto& valor); oautofaz com que o compilador gere uma especialização para cada tipo usado. const auto&evita cópias desnecessárias e aceita qualquer tipo que possa ser impresso.- Chamamos
imprime(42); o compilador instancia a lambda paraint. - Chamamos
imprime(3.14); agora instancia paradouble. - Chamamos
imprime(std::string("Olá")); instancia parastd::string. - Cada chamada imprime o valor e uma quebra de linha.
Por que funciona
Lambdas genéricas (C++14) são como templates: o operador de chamada é um template que aceita qualquer tipo. Isso elimina a necessidade de escrever várias lambdas para tipos diferentes, mantendo o código conciso e reutilizável.
Erros comuns
- Usar
autosemconst&e passar tipos grandes: cópias desnecessárias. - Tentar imprimir um tipo sem
operator<<: erro de compilação. - Esquecer de incluir
<string>ao usarstd::string.
Outra forma de resolver
Usar uma função template:
template<typename T>
void imprime(const T& valor) { std::cout << valor << '\n'; }
Lambdas genéricas são preferíveis quando a função é usada localmente e não precisa ser reutilizada.
Saída esperada
42
3.14
Olá