lambdaとfunctor-classの選択はトレードオフです。
ボイラープレートの量を最小限に抑え、概念的に関連するコードを(すぐにまたは後で)それを利用する関数内にインラインで記述できるようにすることで、ラムダからの利益はほとんど構文的です。
パフォーマンスの面では、これは、単一の「メソッド」を含むC ++構造体またはクラスであるファンクタークラスよりも悪くありません。実際、コンパイラはラムダを、背後でコンパイラが生成したファンクタクラスと同じように扱います。
// define the functor method somewhere
struct some_computer_generated_gibberish_0123456789
{
int operator() (int x) const
{
if (x == 2) return 5;
if (x == 3) return 6;
return 0;
}
};
// make a call
some_computer_generated_gibberish_0123456789 an_instance_of_0123456789;
int outputValue = an_instance_of_0123456789(inputValue);
コード例では、パフォーマンス面では関数呼び出しと違いはありません。そのファンクタークラスには状態がないため(空のキャプチャ句があるため)、割り当て、コンストラクタ、または破棄が不要です。
int some_computer_generated_gibberish_0123456789_method_more_gibberish(int x)
{
if (...) return ...;
return ...;
}
逆アセンブラを使用して重要でないC ++コードをデバッグすることは、常に困難な作業でした。これは、ラムダを使用してもしなくても当てはまります。これは、C ++コンパイラーによる洗練されたコード最適化が原因で、並べ替え、インターリーブ、デッドコードの削除が発生します。
名前をマングルするという側面はやや不愉快であり、ラムダのデバッガーサポートはまだ初期段階にあります。デバッガーのサポートが時間の経過とともに向上することが期待されるだけです。
現在、ラムダコードをデバッグする最良の方法は、ソースコードレベルでのブレークポイントの設定をサポートするデバッガーを使用することです。つまり、ソースファイル名と行番号を指定することです。