ラムダ式(lambda expression)とは
- 要するに名前のない関数 (無名関数、匿名関数)、その場で書く関数 (関数リテラル)
- 値と同じように変数に代入したり関数に渡したりできる。
- C#とC++では微妙に書き方が違う。
- C#は (引数) => {処理}
- C++は [キャプチャ](引数) -> 戻り値 {処理}
- 正確に言うと、C#のラムダ式はdelegateを作る糖衣構文だけど、以下では雑な説明をする。
Action hoge = () => { Console.WriteLine("Hello, world!"); };
hoge();
auto hoge = []{ cout << "Hello, world!" << endl; };
hoge();
static void piyo(Action func)
{
func();
}
static void Main(string[] args)
{
piyo(() => { Console.WriteLine("Hello, world!"); });
}
template <typename Func>
void piyo(Func func)
{
func();
}
int main(void)
{
piyo([]{ cout << "Hello, world!" << endl; });
return 0;
}
Action<string> hoge = (string str) => { Console.WriteLine(str); };
hoge("Hello, world!");
auto hoge = [](string str){ cout << str << endl; };
hoge("Hello, world!");
Func<int, int> twice = (int x) => { return 2 * x; };
Console.WriteLine(twice(13));
auto twice1 = [](int x) -> int { return 2*x; };
cout << twice1(13) << endl;
auto twice2 = [](int x) { return 2*x; };
cout << twice2(13) << endl;
キャプチャ(ラムダ式が定義された関数のスコープの変数を取り込む)
static void piyo(Action func)
{
func();
}
static void Main(string[] args)
{
string hello = "Hello, world!";
Action hoge = () => { Console.WriteLine(hello); };
piyo(hoge);
}
template <typename Func>
void piyo(Func func)
{
func();
}
int main(void)
{
string hello = "Hello, world!";
auto hoge1 = [&] { cout << hello << endl; };
auto hoge2 = [=] { cout << hello << endl; };
auto hoge3 = [ ] { cout << hello << endl; };
piyo(hoge1);
piyo(hoge2);
return 0;
}
- C++では参照かコピーかの区別がある。明示しなければキャプチャできない。
- C++では変数ごとに参照かコピーかの指示もできる。