C++11 で導入されたラムダ式について簡単なサンプルコードを記載します。
以下のように記述します。
#include <iostream>
int main() {
auto f = [](std::string mystr){ std::cout << mystr << std::endl;};
f("Hello World");
return 0;
}
[]
後述のキャプチャリストです。()
引数がない場合は省略できます。{}
関数の本体です。値を書き換える場合。
#include <iostream>
int main() {
int x = 1;
// 参照キャプチャ
auto f = [&] { x = 2; };
// auto f = [&x] { x = 2; }; // としてもよい。
f();
std::cout << x << std::endl; //=> 2
return 0;
}
値をコピーして利用するだけの場合。
#include <iostream>
int main() {
int x = 1;
// コピーキャプチャ
auto f = [=] { return x + 1; };
// auto f = [x] { return x + 1; }; // としてもよい。
std::cout << f() << std::endl; //=> 2
std::cout << x << std::endl; //=> 1
return 0;
}
返り値の型を明示的に指定できます。指定しない場合は暗黙的に推論されます。typeid で型を確認できます。
#include <iostream>
#include <typeinfo>
int main() {
auto f = []() { return 1; };
auto g = []()->float { return 1; };
const std::type_info& ti = typeid(f());
std::cout << ti.name() << std::endl; //=> i
const std::type_info& ti2 = typeid(g());
std::cout << ti2.name() << std::endl; //=> f
return 0;
}
std::function
でラムダ式を引数および返り値に取る関数を定義できます。
#include <iostream>
#include <functional>
std::function< int(int,int) > FF() {
auto f = [](int a, int b) { return a + b; };
return f;
}
void GG(std::function< int(int,int) > FP) {
std::cout << FP(1, 1) << std::endl;
}
int main() {
auto f = FF();
GG(f); //=> 2
return 0;
}
ラムダ式は関数ポインタにキャストすることもできます。
#include <iostream>
typedef int(*FpIII)(int,int);
FpIII FF() {
auto f = [](int a, int b) { return a + b; };
return f;
}
void GG(FpIII FP) {
std::cout << FP(1, 1) << std::endl;
}
int main() {
auto f = FF();
GG(f); //=> 2
return 0;
}