参照によってint->int
ラムダパラメータを受け取る関数を定義する正しい方法は何ですか?
void f(std::function< int(int) >& lambda);
または
void f(auto& lambda);
最後の形式が正当な構文であるかどうかはわかりません。
ラムダパラメータを定義する他の方法はありますか?
auto
パラメーターを使用することはできません。基本的に2つのオプションがあります。
オプション#1:示したようにstd::function
を使用します。
オプション#2:テンプレートパラメーターを使用します。
template<typename F>
void f(F &lambda) { /* ... */}
オプション#2は、組み込みラムダ関数オブジェクトの潜在的なヒープ割り当てを回避できるため、場合によってはより効率的かもしれませんが、f
をテンプレート関数としてヘッダーに配置できる場合にのみ可能です。また、他のテンプレートと同様に、コンパイル時間とIキャッシュのフットプリントが増加する場合があります。ラムダ関数オブジェクトが十分に小さい場合、std::function
オブジェクトでインラインで表される可能性があるため、同様に効果がない可能性があることに注意してください。
template
を次のように使用します。
template<typename Functor>
void f(Functor functor)
{
cout << functor(10) << endl;
}
int g(int x)
{
return x * x;
}
int main()
{
auto lambda = [] (int x) { cout << x * 50 << endl; return x * 100; };
f(lambda); //pass lambda
f(g); //pass function
}
出力:
500
1000
100
私はそれが7年になったことを知っていますが、ここに他の誰も言及していない方法があります:
void foo(void (*f)(int)){
std::cout<<"foo"<<std::endl;
f(1); // calls lambda which takes an int and returns void
}
int main(){
foo([](int a){std::cout<<"lambda "<<a<<std::endl;});
}
どの出力:
foo
lambda 1
テンプレートやstd :: functionは必要ありません