現在のC++言語は、C++11、C++14、C++17などのC++標準規格のバージョンアップを通して、以前のC++言語と比べて大きな機能拡張が行われてます。C++のプログラムコードの可読性、保守性、表現力をより高めるためには、最新であるC++17の言語仕様や標準ライブラリの使用方法を抑えておく必要があります。このブログでは、その機能の一つである「ラムダ式」の使用方法を説明します。
ラムダ式は、C++11で初めて登場し、C++14ではジェネリックスラムダ、C++17では*thisのキャプチャのサポートなど新しい機能が追加され、最新のC++17では、以前のラムダ式よりも使いやすく、さらに強力になりました。
ラムダ式とは、関数のように振舞う関数(クロージャ)オブジェクトを作成することができ、スコープ内の変数をキャプチャできます。(ラムダ式は、記述されている関数のローカル変数をキャプチャとして使用できます。)
ラムダ式の基本的な構文は、以下の通りです。
[キャプチャ](仮引数リスト)->戻り値の型{ 複合文};
- キャプチャ: ラムダ式から参照するオブジェクトを定義
- 仮引数リスト(省略可): 通常の関数と同じように型名と名前を定義
- 戻り値の型(省略可): ラムダ式の戻り値の型を定義
- 複合文: ラムダ式で行う処理を定義
またC++14からジェネリックラムダが使用可能なので、パラメータ(関数の仮引数)型にautoによる型推論が利用できるため、テンプレートのように汎用的で整ったプログラムを書きやすくなります。
実際のコード例を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#ifdef _WIN32 #include #else typedef char _TCHAR; #define _tmain main #endif #include #include using namespace std; int _tmain(int argc, _TCHAR* argv[]) { string hello = "C++"; string world = "17"; auto add_things = [](auto a, auto b) { return a + b; }; auto i = add_things(1, 2); auto s = add_things(hello, world); cout << i << endl; cout << s << endl; cout << [](auto a, auto b){ return a + b; }(2, 2) << 'n'; system("pause"); return 0; } |
上記のコードのうち、次の行に注目してください。
1 |
auto add_things = [](auto a, auto b) { return a + b; }; |
このコードでは、パラメータをauto型で定義しているので、文字列と同様にプラス演算子(+)を定義しているものであれば、どのような型でも動作します。
なお、このプログラムの例では、ラムダ式を使用して、コンソールに結果を出力しています。
1 2 3 4 5 |
auto i = add_things(1, 2); auto s = add_things(hello, world); cout << i << endl; cout << s << endl; |
ラムダ式を利用すると変数に格納する必要はなく、下記のコード例のように括弧の後ろに(2, 2)のパラメータとして数値を直接定義できます。
1 |
cout << [](auto a, auto b){ return a + b; }(2, 2) << 'n'; |
ラムダ式をもっと詳しく知りたい方は、以下のドキュメントを参考ください。
このブログで紹介しましたサンプルコードは、こちらからダウンロードできます。
C++17では、古いC++言語で使用できた機能や標準ライブラリが非推奨、あるいは廃止されているものもありますが、その分プログラムをより書きやすくするために新しく追加されたり、改良されている機能も多くあります。今回紹介したラムダ式もその一つです。
C++Builder 10.4では、最新のC++17の言語仕様をサポートしており、C++17の新機能もすぐに試せます。製品の詳細は、こちらを参照してください。
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition