11. void sample1() {
// 関数内に関数を作成
auto add = [](int a, int b) -> int { return a + b; };
std::cout << add(10, 20) << std::endl;
}
ラムダ式の概要を説明します。
12. void sample1() {
// 関数内に関数を作成
auto add = [](int a, int b) -> int { return a + b; };
std::cout << add(10, 20) << std::endl;
}
ラムダ式を使うと関数内に関数を作成できます。
13. void sample2() {
std::vector<int> = {1, 2, 3, 4, 5};
// 関数の引数内に関数を作成
std::for_each(nums.begin(), nums.end(),
[](int n) { std::cout << n << std::endl; });
}
void sample1() {
// 関数内に関数を作成
auto add = [](int a, int b) -> int { return a + b; };
std::cout << add(10, 20) << std::endl;
}
関数の引数内に関数を作ることもできます。おもに関数内で一時的に使用する小さな関数を作成する機能だと考えてください。
16. []{};
[](int a) { std::cout << a; };
[](int a) -> int { return a * 10; };
何もしないラムダ式
引数あり
引数あり、戻り値あり
戻り値がある場合は->の後ろに戻り値の型を書きます。
17. []{};
[](int a) { std::cout << a; };
[](int a) -> int { return a * 10; };
[n](int a) -> int { return a * n; };
何もしないラムダ式
引数あり
引数あり、戻り値あり
変数nをコピーキャプチャ
変数キャプチャはラムダ式の外側にある変数を取込む機能です。コピーキャプチャは変数の内容をコピーして取込みます。
18. []{};
[](int a) { std::cout << a; };
[](int a) -> int { return a * 10; };
[n](int a) -> int { return a * n; };
[=](int a) -> int { return a * n; };
何もしないラムダ式
引数あり
引数あり、戻り値あり
変数nをコピーキャプチャ
デフォルトコピーキャプチャ
[=]と書くと、キャプチャする変数はすべてコピーして取込むという意味になります。
19. []{};
[](int a) { std::cout << a; };
[](int a) -> int { return a * 10; };
[n](int a) -> int { return a * n; };
[=](int a) -> int { return a * n; };
[=](int a) { return a * n; };
何もしないラムダ式
引数あり
引数あり、戻り値あり
変数nをコピーキャプチャ
デフォルトコピーキャプチャ
戻り値型の省略 (return文のみの場合)
return文だけのラムダ式であれば戻り値型の省略ができます。
31. void lambda_sample(std::vector<int>& nums, int a) {
int b = 10;
std::for_each(nums.begin(), nums.end(),
[a, b](int n) { std::cout << n * a * b << std::endl; });
}
続けて、クロージャの説明をします。
43. // 関数
int add(int a, int b) {
return a + b;
}
// 関数オブジェクト
class Functor {
public:
int operator() (int a, int b) {
return a * b;
}
};
void function_sample() {
std::function<int (int, int)> f;
f = &add; // 関数ポインタ
f = Functor(); // 関数オブジェクト
f = [](int a, int b) { return a / b; }); // ラムダ式
int n = f(20, 10); // functionから関数を呼び出す
}
std::function<戻り値の型(引数の型)>
std::functionの説明です。テンプレートの型指定部分に、代入したい関数の戻り値の型と引数の型を指定します。
44. // 関数
int add(int a, int b) {
return a + b;
}
// 関数オブジェクト
class Functor {
public:
int operator() (int a, int b) {
return a * b;
}
};
void function_sample() {
std::function<int (int, int)> f;
f = &add; // 関数ポインタ
f = Functor(); // 関数オブジェクト
f = [](int a, int b) { return a / b; }); // ラムダ式
int n = f(20, 10); // functionから関数を呼び出す
}
関数を代入するための変数と考える
std::function<戻り値の型(引数の型)>
関数の引数と戻り値の型が一致していれば、ラムダ式の他にも関数ポインタや関数オブジェクトを代入できます。
45. // 関数
int add(int a, int b) {
return a + b;
}
// 関数オブジェクト
class Functor {
public:
int operator() (int a, int b) {
return a * b;
}
};
void function_sample() {
std::function<int (int, int)> f;
f = &add; // 関数ポインタ
f = Functor(); // 関数オブジェクト
f = [](int a, int b) { return a / b; }); // ラムダ式
int n = f(20, 10); // functionから関数を呼び出す
}
関数を代入するための変数と考える
std::function<戻り値の型(引数の型)>
std::function型の変数から間接的に関数を呼び出すことができます。