web-dev-qa-db-ja.com

関数パラメーターとしてのラムダ

autoまたはテンプレートを使用せずにラムダ変数または関数パラメーターを宣言するための表記法は何ですか?そうする方法はありますか?または、コンパイラは、コンパイル時に名前がプログラマに知られていない各ラムダに対して一意のクラスオブジェクトを定義しますか?もしそうなら、なぜですか?何らかの関数ポインタとして渡すことはできませんか?それが不可能な場合、それは大きな失望になります。

59
slartibartfast

ラムダは状態を保持する場合があります(周囲のコンテキストからの参照のキャプチャなど)。そうでない場合は、関数ポインターに格納できます。そうする場合、それらは関数オブジェクトとして保存する必要があります(関数ポインタ内に状態を保持する場所がないため)。

// No state, can be a function pointer:
int (*func_pointer) (int) = [](int a) { return a; };

// One with state:
int b = 3;
std::function<int (int)> func_obj = [&](int a) { return a*b; };
56
Todd Gardner

関数オブジェクトのポリモーフィックラッパー を使用できます。例えば:

#include <functional>

std::function<double (double, double)> f = [](double a, double b) { return a*b };
25
David Alber