ラムダ関数変数を使用するには、次の2つの方法があります。
std::function<int(int, int)> x1 = [=](int a, int b) -> int{return a + b;};
//usage
void set(std::function<int(int, int)> x);
std::function<int(int, int)> get();
と:
std::function<int(int, int)>* x2 = new std::function<int(int, int)>([=](int a, int b) -> int{return a + b;});
//usage
void set(std::function<int(int, int)>* x);
std::function<int(int, int)>* get();
ラムダ関数のデータがどのように格納されているのかわからないので、違いは何ですか。
パフォーマンス、メモリ使用量、およびラムダ関数を引数として渡すか、ラムダ関数を返すための最良の方法を知りたいです。
ラムダ関数オブジェクトのサイズが4より大きい場合、またはエラーを回避するために、ポインターを使用することをお勧めします(アトリビューションを行うときにある種のコピーコンストラクターが実行される場合、または不要なときにある種のデストラクタが実行される場合) 。
ラムダ関数変数をどのように宣言する必要がありますか?
編集
コピーや移動は避けたい、同じ機能を使い続けたい。
この例をどのように変更すればよいですか?
int call1(std::function<int(int, int)> f){
return f(1, 2);
}
int call2(std::function<int(int, int)> f){
return f(4, 3);
}
std::function<int(int, int)>& recv(int s){
return [=](int a, int b) -> int{return a*b + s;};
}
int main(){
std::function<int(int, int)> f1, f2;
f1 = [=](int a, int b) -> int{return a + b;};
f2 = recv(10);
call1(f1);
call2(f1);
call1(f2);
call2(f2);
}
関数recvで参照を返すことができません:
warning: returning reference to temporary
これは良い解決策ですか?
int call1(std::function<int(int, int)>* f){
return (*f)(1, 2);
}
int call2(std::function<int(int, int)>* f){
return (*f)(4, 3);
}
std::function<int(int, int)>* recv(int s){
return new std::function<int(int, int)>([=](int a, int b) -> int{return a*b + s;});
}
int main(){
std::function<int(int, int)> f1 = [=](int a, int b) -> int{return a + b;};
std::function<int(int, int)> *f2 = recv(10);
call1(&f1);
call2(&f1);
call1(f2);
call2(f2);
delete f2;
}
編集(結論)
ラムダ関数オブジェクトは、クラスのインスタンスである他のオブジェクトと同じです。割り当て、引数、帰属のルールは同じです。