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 auto no 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

  1. A lambda imprime é declarada com [](const auto& valor); o auto faz com que o compilador gere uma especialização para cada tipo usado.
  2. const auto& evita cópias desnecessárias e aceita qualquer tipo que possa ser impresso.
  3. Chamamos imprime(42); o compilador instancia a lambda para int.
  4. Chamamos imprime(3.14); agora instancia para double.
  5. Chamamos imprime(std::string("Olá")); instancia para std::string.
  6. 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 auto sem const& e passar tipos grandes: cópias desnecessárias.
  • Tentar imprimir um tipo sem operator<<: erro de compilação.
  • Esquecer de incluir <string> ao usar std::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á