みゆにゃんぶろぐ

ゲーム(開発)/カラオケ/サイクリング/コーヒーの話題多め。最近は不定期更新。なるべく毎週更新したい

7月29日

7月もあと2日。前期の授業もあと1週間

少し前に2年生に進級したと思ってたのに、ほんと早いなぁ……(笑)

 

ラムダ式

今作ってる課題でラムダ式を使う機会があったので、メモも兼ねてまとめておこうと思う

 

C++にはラムダ式と言われる機能(?)がある

ラムダ式は「無名関数」とも言われ、そのまま「名前のない関数」である

書き方は以下の通り

上のラムダ式は「何もしない」という最小のラムダ式。初めて見た人には「なんだこれ?」と思ったと思う。自分も最初見たときはそう思った(笑)

それぞれの意味を説明すると、

[]:ここで変数をコピーしたり、参照したりを選ぶ。[]だと参照したりコピーしない。コピーしたい場合は「=」、参照したい場合は「&」をつける

{}:関数の中身を書く。これは普通の関数と何も変わらない

ほかにも()が間に入ることもある。その場合は普通の関数の引数と同じ意味になる

 

ラムダ式の活用場面としては、今まで引数で関数を渡していたときに、わざわざ専用に関数を作らなくても、その場でラムダ式で関数の中身を書けばいいというメリットがある

典型的な例だと、標準でクイックソートができる関数qsort()。この関数では、引数でどのような順でソートするかを決める比較関数を自作して渡す必要がある。今までは専用に比較関数を自作していたけど、ラムダ式を使えば専用に比較関数を作る必要がなくなる

qsort()+ラムダ式を使って昇順にソートする例がこちら

(※qsort()の使い方がわからない人は、各自で調べてください)

ポイントは4つめの引数でラムダ式を使っているところ。その場で関数が作成できるので、とても便利

あと、ラムダ式はstd::function(関数ポインタみたいなもの)に代入することもできるので、色々試してみるととても便利

 

ちなみに、[]のところで1つ注意

クラスのメンバ関数内でラムダ式を使う場合、メンバにアクセスしたい場合は[]に=や&をつけないとアクセスできない。そこで=や&をつけてアクセスすることになるけど、ここで問題が発生

f:id:clover_0907:20170729005314p:plain

これはAというクラスの中にFunc()というメンバ関数があって、その中でさらにラムダ式を使おうとしてるところ。[&]とすることでメンバにもアクセスできるかと思いきや、候補に出てくるのはpublicなメンバのみ。でも実は「this->a」と書いても何も問題はない(もちろんaのみでも問題ない)。それなのに候補にprivateメンバが出てこないので、少し前の自分はこれで悩んで戸惑っていたという(笑)Visual Studioのバグなのかなぁ……それともわざとそういう隠れた仕様なのかな(笑)