Cpp ラムダ式

提供:yonewiki
2022年9月26日 (月) 10:21時点におけるYo-net (トーク | 投稿記録)による版 (ページの作成:「C++に戻る <table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner"> <tr> <td style="width:1px;"></td> <td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++(Cpp) ラムダ式</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。</td> <…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

C++に戻る

本来の表記は「C++(Cpp) ラムダ式」です。この記事に付けられた題名はテンプレート:記事名の制約から不正確なものとなっています。

※このページではC++にのみ存在する機能として、記事タイトルがC++ ラムダ式になっています。

ラムダ式

よくわからない名称の技術ですが、STL(Standard Template Liblary)のstd::sortやstd::for_eachなどの引数としてプログラムそのものを記述することができる技術です。例えばsortの第三引数には、sortの手続きを行う関数名を指定する必要がありますが、ここにラムダ式を利用することができます。基本的な構造としては[](){}という構造のプログラムになり、[キャプチャ](プログラムの引数)->戻り値{プログラム本体}というような感じです。[](){}のそれぞれのカッコの中の全部が省略可能なので、引数まで省略すると[]{}というのがラムダ式としては最短の構造になります。これでは何にもしないラムダ式になってしまいます。


そもそも、ラムダとは何なのか?ラムダの意味?それは、その昔、関数による計算の記号にλ(lambda:ラムダ)を使っていたことに由来し、関数による計算を行うという技術であることからC++やほかの言語でも、こういったプログラム技術をラムダ式と呼びます。JAVA、LISP、ML、Haskelでも同様にラムダ式という呼び方がされます。


それで…


ラムダ式の何が便利なのか?sort関数を使ったことが無い人、sort関数を使う人でも関数を引数に指定するタイプの人には何の魅力もないものですが、C++11登場以降は、この記述方式を使うプログラマが増えているのも確かで、覚えておかないと人の書いたプログラムが理解できないというポンコツな人になってしまいます。ややこしさレベルはC++の技術の中では関数ポインタに肩を並べるややこしさを持っています。従来の[]の意味は配列だったし->というえばアロー演算子、こういうイメージを持っている場合は全く理解にたどり着けません。先にも書きましたが

  • [キャプチャ](プログラム部に使う引数)->戻り値型名{プログラム本体}


という、こういう構造をよく覚える必要があります。[]()->戻り値の型名{}ですね。とんでもない記号にも見えてきます。新しい技術なのだから新しいと感じて当たり前なのです。予告なく似たような記号の組み合わせが全く違う意味で使われる。これがプログラミングを知ったつもりになっている時おとずれる混乱の原因になります。おぼえてしまえば、なんてことはない変な技術なのです。


特に気になるのが[]の中のキャプチャですね。キャプチャって言われても…意味がいまひとつ分からない。これはラムダ式の関数本体の外側で使っていた変数で、利用するものを指定する部分です。


 最短ではない省略としては

  • [キャプチャ](プログラム部に使う引数){関数本体}


 というのもよく使われると思います。これは関数本体が戻り値を持たないかretuen文で返される値の型に従う場合に ->戻り値の型名 が省略できます。


文字だけであーだこーだ説明してもピンとこないのでまずはサンプルのプログラムを示してみましょう。最初はキャプチャを省略する例から…

C++に戻る