レキシカルクロージャを返す

#include <functional>

std::function<int(int)> make_adder(int x) {
  return [=](int y) { return x + y; };
}

int main() {
  auto add1 = make_adder(1);
  add1(100);  // 101
}

関数、ファンクタ、クロージャを受け取って呼び出す

#include <functional>
#include <iostream>

int apply_function(std::function<int(int)> f, int x) {
  return f(x);
}

// 普通の関数                                                                                        
int square(int x) {
  return x * x;
}

// ファンクタ用のクラス                                                                              
class Square {
public:
  int operator()(int x) {
    return x * x;
  }
};

int main() {
  apply_function(square, 111); // 12321
  apply_function(Square(), 1111);  // 1234321
  apply_function([](int x) { return x * x; }, 11111);  // 123454321
}

サイズ

#include <functional>
#include <typeinfo>

int main() {
  auto f = [](int x) { return x * x; };
  std::cout << "sizeof(closure) = " << sizeof(f) << std::endl;  // sizeof(closure) = 1
  std::cout << typeid(f).name() << std::endl;  // Z4mainE3$_2

  std::function<int(int)> g = f;
  std::cout << "sizeof(std::function) = " << sizeof(g) << std::endl;  // sizeof(std::function) = 48
  std::cout << typeid(g).name() << std::endl;  // NSt3__18functionIFiiEEE

  int(*h)(int) = f;
  std::cout << "sizeof(funcptr) = " << sizeof(h) << std::endl;  // sizeof(funcptr) = 8
  std::cout << typeid(h).name() << std::endl;  // PFiiE
}