→ PkmX: 1你要考慮bind的結果被呼叫前a被修改的情況07/14 01:26
對,所以我底下有提到應付這情況的做法
就是先copy,然後再move
→ PkmX: 或是同一個bind的結果被呼叫多次的情況啊07/14 01:26
我不懂為甚麼要呼叫多次bind object?
更何況bind object本身可以copy與move,為甚麼不是user自己處理多次呼叫的問題?
如果要最大化效能,bind不就應該只考慮呼叫一次的情況嗎?
→ PkmX: 2的話要寫成07/14 01:44
→ PkmX: bind(test_mov, bind(move<A&>, move(a)))();07/14 01:46
忘了還有這方法,但是這方法有點醜...
→ PkmX: 但是這個結果就只能呼叫一次07/14 01:47
→ cplusplus: 確實bind傳回functor是要能之後用呀,不然要它幹嘛?XD07/14 02:38
→ cplusplus: 所以沒辦法用最後提到A&&那個也很正常,不太合使用情境07/14 02:41
如果只呼叫一次,情境就很多了
→ PkmX: 其實我覺得有了lambda以後 bind就很少用了XD07/14 02:41
如果你必須馬上copy argument,那lambda就不能用了
考慮到parameter pack,你要怎麼copy?
(不過聽說可以用tuple解決,但我不會用tuple XD)
→ cplusplus: 如上面仁兄所說,一般用rval ref傳入只能用一次,參數07/14 02:42
→ cplusplus: 通常就被修改掉了(如果不會也沒需要用rval ref當參數) 07/14 02:43
→ cplusplus: SORRY切斷了。同意多用lamda,好處多多XD07/14 02:44
→ cplusplus: 少了b07/14 02:46
→ PkmX: 是我切斷你了XD C++14可以做move capture 2就可以直接寫成 07/14 02:46
→ PkmX: [a{move(a)}]() mutable { test_mov(move(a)); }();07/14 02:47
→ cplusplus: 先撇開bind不說,想了一下還想不到需要這樣用的情境~07/14 03:06
→ cplusplus: 不知原有啥用到的例子嗎??07/14 03:07
假設你用bind object傳給另一個已經在執行的thread(但目前被暫停)
而原本的g為了效能考量,parameter是用&&
結果你卻必須改變g的signature才能達到這功能
→ cplusplus: smart pointer應用?07/14 03:25
→ PkmX: 多次呼叫你可以考慮類似generator的應用07/14 11:51
→ PkmX: auto f = std::bind([](int& n) { return n++; }, 0); 07/14 13:33
→ PkmX: f(); f(); f(); 07/14 13:33
那這樣我可以理解
也就是bind應用的場合在
1. 需要馬上copy argument時(以便之後的callback)
2. 會多次呼叫bind object(所以不接受r-value reference)
但是我想到的應用場合是
1. 需要馬上copy argument時(以便之後的callback)
2. 只會呼叫1次bind object(所以需要perfect forwarding)
那這樣看來,我可能要自己寫一個bind object了
(不然就是要傳bind object給bind,但是這樣很醜...)
→ PkmX: 用lambda吧XD [=]() mutable { test_mov(std::move(a)); } 07/14 14:40
考慮這個
template<class Func,class ... Args>
void test(Func &&func,Args &&...args)
{
bind(std::forward<decltype(func)>(func)
,std::forward<decltype(args)>(args)...);
}
如果用lambda,那
template<class Func,class ... Args>
void test(Func &&func,Args &&...args)
{
[???]{
std::forward<decltype(func)>(func)
(std::forward<decltype(args)>(args)...);
};
}
lambda沒辦法解決這問題
→ PkmX: 如果 ??? 是 = 就和 std::bind 是一樣的啊 07/14 16:25
對 你突破盲點了 XD
如果用lambda時有用ref,那=就會跟bind一樣
→ PkmX: 可是bind那樣寫也是沒辦法處理func是吃rvalue ref的情況 07/14 16:26
→ 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
→ cplusplus: C++提供很多機制可以用,但怎麼用也蠻重要,有時候是 07/14 17:21
→ PkmX: 雖然我覺得arg_ref_t改一改也可以給bind用 07/14 17:21
→ cplusplus: 設計上的問題,不一定非用不可,就像數值類型的class 07/14 17:21
→ cplusplus: 要把op+-*/複寫成完全不相關的操作也行啊,但不是好事 07/14 17:22
→ cplusplus: 所以才想知道原PO的情境跟用途。而且確實bind出來的東 07/14 17:22
我要的就是盡可能減少copy次數,因為現在的bind需要將data copy給g
但我不需要可重複呼叫的bind object,所以現在的bind不符合我的要求
→ cplusplus: 西,蠻多都是把一些設定用的參數用好方便後面一直呼叫 07/14 17:23
→ cplusplus: 有些書本提到,如果move不昂貴,有時候多幾次move可能 07/14 17:24
→ cplusplus: 產生的效能成本拿來換程式維護/易用性可能更划算 07/14 17:26
→ cplusplus: 所以好奇原PO想怎麼用~ 還有能用lambda就用,效能有機 07/14 17:27
我不是不用lambda
是我要馬上copy argument,所以lambda不能達到我的要求(因為我沒想到用lambda+ref)
→ cplusplus: 可提升/最佳化的機會多許多(ex,function inline) 07/14 17:28
→ cplusplus: 話說use_lambda可能也要考慮f不是function是functor的 07/14 17:34
→ cplusplus: 可能性,不然拿回來的lambda呼叫時可能會炸掉~ 07/14 17:35
→ cplusplus: 唔,看錯了,昏... 07/14 18:26
→ PkmX: 查了一下Scott Meyers認為C++14以後已經沒有使用bind的必要 07/14 20:11
→ PkmX: C++14對lambda新增的features讓他可以完全取代bind的功能 07/14 20:11
是
如果lambda+ref,那就可完全取代bind了
→ PkmX: 所以只是看用哪個寫比較好懂好維護這樣 07/14 20:13
※ 編輯: Caesar08 (140.114.233.71), 07/19/2016 01:17:52