C++14の一般化ラムダ式(ジェネリックラムダ)の使い方を解説
C++11ではラムダ式が導入されました。ラムダ式とは、他の関数呼び出しの中に直接記述できる無名関数のことで、コードの一部としてその場で定義・利用できます。さらにautoキーワードと組み合わせることで、ラムダ式を変数に格納し、後から再利用することも可能です。
C++14では、このラムダ式がさらに強化されました。それが一般化ラムダ式(ジェネリックラムダ)です。従来のC++11のラムダ式では、引数の型を明示的に指定する必要がありましたが、一般化ラムダ式では引数の型にautoを使えるようになり、1つのラムダ式で複数の異なる型に対応できるようになりました。
例えば、「整数同士の加算」「浮動小数点数同士の加算」「文字列の連結」など、異なる型に対して同じ処理を行いたい場合、一般化ラムダ式を使えば1つの定義で済みます。
基本構文
一般化ラムダ式の構文は以下の通りです。引数の型がautoになっている点がポイントです。
[](auto x, auto y) { return x + y; }
サンプルコード
実際のコード例を見てみましょう。同じラムダ式で整数、浮動小数点数、文字列という3種類の異なる型を処理しています。
#include <iostream>
#include <string>
using namespace std;
int main() {
auto add = [](auto arg1, auto arg2) { // 一般化ラムダ式を定義
return arg1 + arg2;
};
cout << "Sum of integers: " << add(5, 8) << endl;
cout << "Sum of floats: " << add(2.75, 5.639) << endl;
cout << "Concatenate Strings: " << add(string("Hello "), string("World")) << endl;
return 0;
}
実行結果
Sum of integers: 13 Sum of floats: 8.389 Concatenate Strings: Hello World
解説
この例では、ラムダ式addは引数の型をautoで受け取るため、コンパイラが呼び出し時に渡された実引数の型から自動的に推論します。
add(5, 8)→int型同士の加算となり、13が出力されます。add(2.75, 5.639)→double型同士の加算となり、8.389が出力されます。add(string("Hello "), string("World"))→std::string同士の連結となり、Hello Worldが出力されます。
内部的には、一般化ラムダ式はoperator()がテンプレート化された関数オブジェクト(クロージャ型)として扱われます。つまり、テンプレート関数を簡潔に書くための手段とも言えます。
まとめ
C++14の一般化ラムダ式を使うことで、型ごとに関数やファンクタを個別に定義する手間が省け、コードの再利用性と可読性が大きく向上します。特にSTLアルゴリズムのコールバックなどで、さまざまな型に対応する処理を簡潔に記述したい場合に非常に便利な機能です。
-
Rubyのラムダ徹底解説――基本から実践的な応用テクニックまで
Rubyにおいてブロックは非常に重要な存在であり、ブロックなしにこの言語を語ることはできません。では、ラムダはどうでしょうか?ラムダを愛している人はいるのでしょうか?実際のところ、何年もラムダを使わずに過ごすことだって可能かもしれません。まるで昔の時代の遺物のように見えることもあるでしょう。 しかし、それは完全な真実ではありません。少し掘り下げてみると、ラムダには興味深い技が数多く隠されているのです。 この記事では、まずラムダの基本的な使い方から始め、その後、より高度で面白い応用へと進んでいきます。すでに毎日ラムダを使いこなしている方は、ぜひ後半の応用編までスクロールしてください。 ラムダにつ
-
AWS LambdaでRailsアプリを動かす方法!Lambyを使ったデプロイ手順を徹底解説
サーバーレスコンピューティングは、サーバーの管理やプロビジョニングの作業をクラウドプロバイダーにオフロードできる仕組みとして、多くのテックチームで急速に標準になりつつあります。その代表格がAWS Lambdaです。LambdaはNode.js、Java、Python、Rubyといった主要なプログラミング言語を幅広くサポートしています。しかし、言語そのものだけでなく、それらの言語で構築されたフレームワークの機能に依存するサーバーレス関数を実行したいケースもあるでしょう。 本記事では、RailsアプリケーションをAWS Lambda上で実行する方法を解説します。サーバーレスコンピューティングとAW