C++14のジェネリックラムダ(汎用ラムダ)とは?仕組みと使い方を実例で解説
ラムダ式とC++14での進化
C++11で導入されたラムダ式は、関数内に直接記述できる無名関数であり、他の関数呼び出し文の中にネストして埋め込むことができます。また、autoキーワードと組み合わせることで、ラムダ式を変数に格納し、後から再利用することも可能です。
C++14では、このラムダ式がさらに拡張され、ジェネリックラムダ(汎用ラムダ)と呼ばれる機能が追加されました。これにより、パラメータの型をautoで宣言できるようになり、1つのラムダ式で複数の異なる型を扱えるようになりました。例えば「整数の加算」「浮動小数点数の加算」「文字列の連結」など、型の異なる処理を同一のラムダ式で実現したい場合に非常に便利です。
基本構文
ジェネリックラムダの基本的な構文は次の通りです。
[](auto x, auto y) { return x + y; }引数の型にautoを指定すると、コンパイラが呼び出し時の実引数から型を自動的に推論します。
サンプルプログラム
それでは、1つのジェネリックラムダを使って、整数・浮動小数点数・文字列の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
仕組みの解説
ジェネリックラムダは、内部ではテンプレート化されたoperator()を持つクロージャオブジェクトとして実装されています。概念的には、次の構造体とほぼ同等です。
struct Adder {
template <typename A1, typename A2>
auto operator()(A1 arg1, A2 arg2) const {
return arg1 + arg2;
}
};そのため、add(5, 8)のように呼び出せばint型同士の加算、add(2.75, 5.639)ならdouble型の加算、そしてstd::stringを渡せば文字列連結として動作します。
このようにC++14のジェネリックラムダを活用すれば、型ごとに関数を重複して定義する必要がなくなり、コードを大幅に簡潔に保つことができます。
-
データスクレイピングの仕組みを徹底解説!自動化の基本と始め方
この記事を読んでいるということは、データスクレイピングのメリットについてすでに耳にしたことがあるかもしれません。自動化された技術を活用すれば、面倒な手作業なしに大量のデータを収集できる――そんな話です。では、データスクレイピングは実際にどのように機能するのでしょうか?難易度は高いのか、それとも誰でも習得できるのでしょうか?純粋な好奇心から知りたい方もいれば、自分のビジネスや副業に活用できるかどうか検討している方もいるでしょう。いずれにしても、この記事を読み終える頃には、データスクレイピングの概要、スクレイピングプロセスの実際の仕組み、そして始め方まで、しっかりと理解できるようになっています。そ
-
Snapchatの仕組みとは?基本用語から使い方まで初心者向けに徹底解説
モバイルメッセージアプリの世界に革命をもたらしたと言えば、それはSnapchat(スナップチャット)についての言葉として決して大げさではありません。Snapchatが登場する以前、友達とこんなユニークな方法でコミュニケーションができると想像した人はほとんどいませんでした。送った画像や動画が自動的に消えるという「自己消滅型メッセージ」という独自のコンセプトにより、Snapchatは従来のメッセージアプリやSNSとは一線を画す存在となっています。2011年の登場以来、Snapchatは1日あたり1億8000万人以上のアクティブユーザーを抱える、世界で最も人気のあるアプリの一つへと成長しました。また