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
オブジェクト内でインラインで表される可能性があるため、効果がない場合もあることに注意してください。
std::function
最初に汎用ラッパーをジャンプすることなく、ラムダを直接実行します)
std::function
オブジェクト内でインラインで表される可能性がある」というこの引用は誤解を招く恐れがあります。ラムダは常にインラインで利用できます(コンパイラーはもちろんそうしないことを選択できます)。 std::function
実装では通常、ヒープの割り当てを回避するために小さなオブジェクトの最適化を使用します。ラムダのキャプチャリストが十分に小さい場合はstd::function
、ヒープを使用せずに格納されます。それ以外は、ラムダのサイズには実際の意味はありません。
&
にあるのvoid f(F & lambda)
ですか?
私は次のように使用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は必要ありません
std::function
、テンプレートバージョンにはこの制限がありませんが、正確な署名を指定する必要があります(ただし、ケースと同じ)。
void f(auto& lambda);
近いです。実際にコンパイルされるのは次のとおりです。
#include <cassert>
/*constexpr optional*/ const auto f = [](auto &&lambda)
{
lambda();
lambda();
};
int main()
{
int counter = 0;
f([&]{ ++counter; });
assert(counter == 2);
}
const&
ですか?