Re: [問題] bind object(std::bind)內部用copy?

看板C_and_CPP作者 (Caesar)時間8年前 (2016/07/14 21:45), 8年前編輯推噓0(003)
留言3則, 1人參與, 最新討論串2/2 (看更多)
: → PkmX: 可是bind那樣寫也是沒辦法處理func是吃rvalue ref的情況 07/14 16:26 : → PkmX: http://melpon.org/wandbox/permlink/i6hpL0VL93nEqzbz 07/14 17:17 : → PkmX: 這個版本用lambda可以達到你要的效果 建立時先複製args一次 07/14 17:18 : → PkmX: 然後因為只用一次 他會直接把複製的args move給func 07/14 17:19 : → PkmX: 但若func要lvalue ref 會用template版本轉成lvalue ref給它 07/14 17:20 因為有點離題了,所以另開一篇文章 template<class Func,class ... Args> auto test_lambda(Func &&func,Args &&...args) { return [=]() mutable{ func(move(args)...); }; } 這是我之前寫的方法 但是如果argument是array,那需要做decay(不然不能通過compile) 所以新的方法就變成 template<class T> decay_t<T> decay_copy(T &&val) { return std::forward<decltype(val)>(val); } template<class Func,class ... Args> auto test_decay_(Func &&func,Args &&...args) { return [&]{ std::move(func)(move(args)...); }; } template<class Func,class ... Args> auto test_decay(Func &&func,Args &&...args) { return test_decay_(decay_copy(std::forward<decltype(func)>(func)) ,decay_copy(std::forward<decltype(args)>(args)...)); } 其實我希望的作法是像thread的實作方式,也就是 INVOKE(decay_copy(std::forward<decltype(func)>(func)) ,decay_copy(std::forward<decltype(args)>(args)...)); 但是最後再傳給func的時候是用move的方式去傳的 可是上述的function有一個問題test_decay_的capture list是& 所以在呼叫test_decay的return value的時候 就會當掉了 阿如果我用test_lambda的方式,就不能像thread的實作方式一樣了... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.114.233.71 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1468503948.A.359.html

07/14 23:41, , 1F
為什麼如果argument是array要做decay呢?
07/14 23:41, 1F
1. 如果不decay的話,那直接用test_lambda會compile失敗 2. 因為thread也用decay
http://ideone.com/crr8OY vc++也不能通過 不過如果把test_int改成lambda,那g++就可以通過 不過vc++仍然不能通過

07/15 12:32, , 3F
這個應該是g++的bug?根據expr.prim.lambda/16應該是ok的
07/15 12:32, 3F
OK 我覺得我找到一個可行解了 1. 用tuple配合C++17的apply 2. 用tuple與C++14的make_index_sequence,做出C++17的apply ※ 編輯: Caesar08 (140.114.233.71), 07/18/2016 14:09:00
文章代碼(AID): #1NXvUCDP (C_and_CPP)
文章代碼(AID): #1NXvUCDP (C_and_CPP)