ラムダ式もC ++になりました

画像

多くのプログラミング言語では、式の中に名前のないローカル関数を即座に作成できます。 これらの言語には、C#3.0、Python、ECMAScript、およびほぼすべての関数型プログラミング言語(HaskellやSchemeなど)が含まれます。 このような関数は通常ラムダ関数と呼ばれ、広く使用されています。



C ++ 0xは、1998年に公開され2003年に更新された既存の標準(ISO / IEC 14882)を置き換える予定の新しいC ++言語標準の非公式名です。前身はC ++ 98およびC +とも呼ばれます。 +03。 新しい標準は、言語にいくつかの追加を追加し、標準C ++ライブラリを拡張します。 言語拡張機能の1つは、ラムダ式を使用する機能です。 今日、この機能がVisualStudio 2010およびGCC向けに実装されていることは非常に喜ばしいことです。

画像画像



式ラムダ -関数ポインターと機能オブジェクトの利点を組み合わせたプログラミング手法は、不便さを回避します。 機能オブジェクトと同様に、ラムダ式では状態を保存できますが、機能オブジェクトとは異なり、コンパクトな構文ではクラス宣言は必要ありません。 ラムダ式を使用すると、機能オブジェクトを使用するよりもコンパクトなコードを記述し、ミスを回避できます。



機能オブジェクトは、オーバーロードされた「()」演算子を持つ通常のオブジェクトであることを思い出させてください。 したがって、構文の観点では、これらは通常の関数です。



まず、関数ポインターを使用した例を見てみましょう。 0から19までの数字で配列を埋める必要があると想像してください。現在の標準を使用して配列を埋めるためのオプションの1つを以下に示します。

画像



このソリューションの欠点は、関数の外部で変数「値」の状態を追跡できないことです。

次に、機能オブジェクトを使用して同じタスクを実装します。 実装オプションを以下に示します。

画像

この手法はうまく機能し、変数「n」の状態を追跡できますが、クラス宣言が必要です。



次に、ラムダ式を使用して同じ操作を実行するのがどれほど簡単かを見てみましょう。

画像



構文ラムダ式:

画像

1)可変マスク

2)パラメータのリスト

3)値で渡されるパラメーターを変更する

4)除外仕様

5)返品タイプ

6)ボディラムダ式



変数のマスク

ラムダ式は、ほぼすべての変数にアクセスし、本体内で使用できます。 スナップショットは、ラムダ式の本体でパラメーターを取得する方法を定義します。 アンパサンド(&)が前に付いている変数へのアクセスは、参照によって実行され、その前には、値によってそれぞれアンパサンドがありません。 空のマスク([])は、式の本体が変数にアクセスできないことを意味します。



標準マスクは、参照または値によって変数にアクセスするかどうかを決定します。 「&」を設定すると、すべての値が参照によって取得されます。 「=」を使用すると、変数は値によって取得されます。 たとえば、ラムダ式の本体が参照による外部変数「total」および値による変数「factor」へのアクセスを取得する場合、マスクは次のように記述する必要があります。

画像

また、クラスメソッド内でラムダ式を使用できます。 「this」ポインターを渡すことにより、このクラスのメソッドとメンバーにアクセスできます。



パラメータリスト

ラムダ式のパラメーターリストには、関数のパラメーターのリストが含まれていますが、次の制限があります。

1)パラメータリストにデフォルト値を含めることはできません

2)名前のないパラメーターを含めることはできません

3)限られた数のパラメーター

画像

また、ラムダ式は別のラムダ式をパラメーターとして使用できます。 一方、パラメーターリストはオプションの要素であり、含めることなく式を記述できます。

画像

値で渡されるパラメーターを変更する

この仕様では、ラムダ式の本体を許可し、値によって取得された変数を置き換えることができます。

画像

例外仕様

式lambdaには、ボディが例外をスローしないようにする例外仕様が含まれる場合があります。

画像

戻りタイプ

仕様では、ラムダ式の戻り値の型を定義しています。 式の本体に「return」ステートメントが1つしかない場合、または値をまったく返さない場合は、この構成を使用できません。 本体に「return」ステートメントが1つしか含まれていない場合、コンパイラは「return」ステートメントのタイプと同一のラムダ式の戻りタイプを設定します。

画像

ボディラムダ式

コードブロックやメソッドの場合と同様に、式の本体にも同じ制限が課せられます。



この機能はVisualStudio 2010およびGCCで既に利用可能です。コードをさらに改善するのに役立つと思います。




All Articles