忍者ブログ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2025/05/18

ラムダ式ってなんぞ

vs2015のプロジェクトを立ち上げてすぐに目についた処理

プログラム
create_task([this, deferral]()
{
 m_deviceResources->Trim();
 // ここにコードを挿入します。
 deferral->Complete();
});

//-----------------------------------------------------

// シーン オブジェクトを更新します。
m_timer.Tick([&]()
{
 // TODO: これをアプリのコンテンツの更新関数で置き換えます。
 m_sceneRenderer->Update(m_timer);
 m_fpsTextRenderer->Update(m_timer);
});

むむ、これはラムダ式……
見たことはあるけど触ったことはない。
ということで軽く勉強。

・ラムダ式の定義
[] : ラムダキャプチャ(キャプチャは「&:参照」「=:コピー」で変数ごとの指定も可能)
() : 引数(ない場合省略可)
{} : 複合ステートメント(処理の実装部分)

・ラムダ式を使ってみる
 (※最後のカッコは「呼び出し」で、引数を渡します。)

プログラム
// 15を返す式( キャプチャ:無し 引数:無し 実装:return 15 )
int val15 = [] () { return 15; } ();
int val15 = [] { return 15; } (); // 引数部無しでも可

// 足し算( キャプチャ:無し 引数:int a, b; 実装:return a+b )
int a = 5, b = 7;
[] (int a, int b) { return a+b; } ( a, b );

// テスト関数
int testFunc()
{
 int a = 10, b = 2, c = 3;
 // aを20で上書きする( キャプチャ:参照 引数:なし 実装:a = 20)
 [&] { a = 20; } ();

 // ちなみにキャプチャがコピーのとき値の変更は不可能
 // この例だとたとえ変更できてもコピーされた値を書き換えただけなので
 // 結局反映されないんですけどね。
 //[=] { a = 20; } (); // コンパイルエラー
 
 return a*b - a*c;
}

ざっとこんな感じみたいです。

普通に関数書けるのであれば難しくないですね。
Func();
ラムダ();

むしろこれを引数にできたりするので実装を外に丸投げできますし
かなり素敵な機能……。

使うタイミングがあれば使っていこうかな、と思います。

拍手[0回]

PR

2015/08/09 プログラム Comment(0)

COMMENT

COMMENT FORM

NAME
MAIL
WEB
TITLE
COMMENT
PASSWORD

プロフィール
 
HN:
ユニ
性別:
男性
 
 
カテゴリー
 
 
 
最新記事
 
(03/09)
(10/27)
(08/09)
(07/15)
(06/02)