これは概念的な質問かもしれません。私はパラメータとしてlambda
を取る機能を実装しています。しかし、私はlambda
の正確なタイプを理解できませんでした。たとえば:ラムダ閉鎖で移動を適用
auto T = []() { printf("hello world\n"); };
auto F = move(T);
T(); // print "hello world"
F(); // print "hello world"
私はT
にmove
を呼び出した後に考え、T
の内容が消失しました。言い換えれば、私は次のような動作を期待:戻る元の質問に
function<void> T = []() { printf("hello world\n");};
auto F = move(F);
F(); // print "hello world"
T(); // throw error
を、function<void()>
のクラスメンバーにlambda
を割り当てる/受け渡しのベストプラクティスは何ですか?私は、多くの異なった答えを見て、いくつかはconst function<void()>&
を使用して、テンプレートF&&
struct Foo {
function<void()> f;
// Option 1:
void set_f(const function<void()>& in) {f=in;}
// Option 2: template
template <typename F>
void set_f(F&& in) { // what to write here??? }
}
を示唆して他の人は、ほとんどの入力タイプをキャプチャするのに十分な一般的なこれら二つのオプションはありますか?
'f = std :: move(in);'もうまくいくでしょうか? –
@dau_sama 'f'が引数に代入される限りは動作しますが、呼び出し側が期待することはできません。 'set_f'を非' const :: lvalue reference 'で 'std :: function'と呼んでいれば、それはあなたが望んでいないと思われる引数を'動かす'でしょう。いつも 'move'をしたいのであれば、代わりに' F'を値で取るべきです。 – Praetorian