ジェネリックラムダとクロージャ(C++14)
auto引数を持つジェネリックラムダを書き、クロージャ型について考えます。
「ジェネリックラムダとクロージャ(C++14)」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
ジェネリックラムダ
C++14では、ラムダのパラメーターリストにautoを記述できます。コンパイラーはテンプレート化されたoperator()を生成するため、ラムダは任意の型を受け取れます。
auto print = [](const auto& x) {
std::cout << x << "\n";
};
print(42);
print("hello");
print(3.14);仕組み
ラムダは、テンプレート化されたoperator()を持つクラスになります。型の組み合わせが異なるたびに、内部では別の関数がインスタンス化されます。
利用例
ジェネリックラムダは、複数の型を扱うアルゴリズムで力を発揮します。
std::vector<int> ints = {1, 2, 3};
std::vector<std::string> strs = {"a", "b"};
auto printAll = [](const auto& container) {
for (const auto& x : container) std::cout << x << " ";
};
printAll(ints);
printAll(strs);複数のautoパラメーター
各autoは独立しています。そのため、異なるパラメーターから異なる型が決まることがあります。
auto add = [](auto a, auto b) {
return a + b;
};
std::cout << add(1, 2.5); // 3.5
std::cout << add(std::string("Hi"), "!"); // Hi!クロージャはオブジェクト
各ラムダ式はクロージャを作成します。これは、コンパイラーが生成する一意のクラスのインスタンスです。クロージャは、キャプチャした変数をメンバーとして保持します。
ラムダごとに異なる型
2つのラムダ式のテキストが同じでも、各ラムダ式は一意の型を持ちます。型名を直接記述することはできないため、autoまたはstd::functionを使用してください。
std::functionへのラムダの格納
型が既知の変数にラムダを保持するには、std::functionでラップします。わずかなオーバーヘッドが加わりますが、呼び出し可能オブジェクトに対する実行時ポリモーフィズムが可能になります。
#include <functional>
std::function<int(int)> doubler = [](int x) { return x * 2; };型消去のコスト
std::functionは型消去を使用します。互換性のある任意の呼び出し可能オブジェクトを格納できますが、ヒープ割り当てと仮想呼び出しが追加されます。頻繁に実行されるループでは避けてください。
autoで十分な場合
短時間しか存続しないラムダ(アルゴリズムに渡すラムダやautoに格納するラムダ)では、型消去は不要で、オーバーヘッドもありません。
ラムダを返す
ラムダを返すには、戻り値の型にautoを使用します。呼び出すたびに新しいクロージャが作成されます。
auto makeAdder(int n) {
return [n](int x) { return x + n; };
}
auto add5 = makeAdder(5);
std::cout << add5(10); // 15高階関数
ラムダによって、C++でも高階関数を快適に扱えるようになります。高階関数とは、他の関数を受け取ったり返したりする関数です。
クイックチェック
C++14のラムダのパラメーターリストにあるautoは、何を意味しますか。
まとめ
C++14のジェネリックラムダは、コンパイル時ポリモーフィズムのためにautoパラメーターを使用します。各ラムダは一意のクロージャ型なので、保持するにはautoを使用し、型消去が必要な場合はstd::functionを使用してください。
AI チューターと学ぶ C++ — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 51
- レッスン
- 203
よくある質問
「ジェネリックラムダとクロージャ(C++14)」レッスンは無料ですか?
はい。「ジェネリックラムダとクロージャ(C++14)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「ジェネリックラムダとクロージャ(C++14)」で何を学びますか?
auto引数を持つジェネリックラムダを書き、クロージャ型について考えます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ジェネリックラムダとクロージャ(C++14)」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 関数オブジェクトとファンクター
- ラムダの値キャプチャ、参照キャプチャ、mutable
- ジェネリックラムダとクロージャ(C++14)
- std::functionによる型消去可能な呼び出し可能オブジェクト