Back to TILs

C++ Lambdas

Date: 2018-08-15Last modified: 2022-12-27

Table of contents

Funções de primeira classe

Em programação funcional funções são cidadães de primeira classe, o que significa que elas se comportam com dados e suportam quaisquer operações que a linguagem permita.

Algumas características das funções de primeira classe são:

Lambdas

Lambdas são funções anônimas (sem um nome) definidas in-place.

//  1   2                           3                               4
   [ ] ( ) { std::cout << "Hello from C++ Lambda!" << std::endl; } ( );

Vamos ver o que cada grupo significa:

Programação funcional com lambdas

// f(x,y) = x² + y² + 2xy;
std::function<int(int,int)> fxsquare = [](int x, int y) -> int {
  int xsquare = [](int x) -> int { return x * x; }(x);
  int ysquare = [](int y) -> int { return y * y; }(y);
  int twoxy   = [](int x, int y) -> int { return 2 * x * y; }(x,y);
  return xsquare + ysquare + twoxy;
}

cout << fxsquare(5,3) << endl; // 64

Lambda capture

  int var = 42;

  const auto add_by_value = [var](int x) -> int { return x + var; };
  const auto add_by_ref = [&var](int x) -> int { return x + var; };

  cout << add_by_value(10) << endl;  // 52
  cout << add_by_ref(10) << endl;    // 52
  var = 100;
  cout << add_by_value(10) << endl;  // 52
  cout << add_by_ref(10) << endl;    // 110

Polymorphic lambda

  double n1 = 42;
  float n2 = 42;

  auto fp = [](const auto &n) -> auto { return n * 4; };

  auto x1 = fp(n1);
  auto x2 = fp(n2);

  cout << "value of x1: " << x1 << " type of x1: " << typeid(x1).name() << endl;
  cout << "value of x2: " << x2 << " type of x2: " << typeid(x2).name() << endl;

Possible output

52
52
52
110
value of x1: 168 type of x1: d
value of x2: 168 type of x2: f

Referências