明日への断片

ゲーム制作やプログラミング関する記事を中心に更新していこうと思います。

66欠片目:ラムダ関数の勉強

 こんにちは。昨日目が覚めたのがam11:00過ぎだったvoidです。
全く目が覚めませんでしたので、よっぽど疲れていたんだなぁという実感がわきました。
それと同時に貴重な休日の活動時間がガッツリ削られたショックが大きいです...しかもまだ疲れは完全に取れきっていない...


C++11新機能

 昨日のunique_ptrに引き続き、同じくC++11から新しく追加された機能であるラムダ関数を勉強していこうと思います。というのも、これから主に使っていく開発環境、DirectXTKではC++11の機能が使われているため、C++11の機能をあらかじめ理解しておくことがチュートリアルサイトで推奨されています。そんな経緯でC++の機能を学校で習ってない部分もやっておこうというのが今回の目的なのです。

ラムダ関数

 ラムダ関数とは、無名関数あるいは匿名関数と呼ばれ、名前のない関数を定義して関数を変数やクラスのように扱う機能の事ができるものです。


...正直この説明ではピンときませんでしたが、簡単に言うと名前を付けずに関数を扱えるということです。

ラムダ関数の書き方

 最短のラムダ関数(何もしない関数)を書くとこうなります。

[]{};

???ますます意味が不明になります...

元々の構文を見てみましょう

[キャプチャ](パラメータ)->戻り値の型{関数本体};

パラメータと戻り値はない場合省略できるので、最短があのようになるのですね。
ではそれぞれがどんな意味か見ていきたいと思います。

キャプチャ 外部の変数にアクセスする方法を指定できます。
パラメータ 引数を指定できます。
戻り値の型 戻り値の型を指定できます。
関数本体 関数で行う処理を書きます。

基本的には通常の関数と同じような構造ですね。
見慣れないのはキャプチャの部分です。


キャプチャでは関数外部の同ブロック内の変数にアクセスするときの方法を指定できます

[] 何も指定しないと、外部の変数にはアクセスできません。
[x] 外部の変数xに値としてアクセスします(上書き不可)
[&x] 外部の変数xに参照としてアクセスします(上書き)
[=] 外部の変数に値としてアクセスします(上書き不可)
[&] 外部の変数に参照としてアクセスします(上書き)
[キャプチャ](パラメータ)->戻り値の型{関数本体}();

このように()を付けることで関数として呼び出すことが出来ます。

サンプルプログラム



実行結果:

f:id:yasu-game-void:20170416113427j:plain

メリット

 第1のメリットとして、関数に名前を付けなくてもよいという点があります。関数名を増やさない(関数名の衝突を防ぐ)ことができるので名前を考えるのにとられる時間も無くなります。
 次に、その場限りで使うときに、記述が簡潔になることです。述語関数というものとして記述するときにコードを簡略化することが出来ます。
 後者に関してはまだ学習していない要素が絡んでるようなので、そちらも時間を見つけて勉強しようと思います。



本日は以上。ではまた!