C++のラムダ関数

2015-09-08
blog

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

#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
}