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

作者: Caesar08 (Caesar)   2016-07-14 21:45:46
: → 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的實作方式一樣了...
作者: PkmX (阿貓)   2016-07-14 23:41:00
為什麼如果argument是array要做decay呢?http://melpon.org/wandbox/permlink/pkQz2gti5DmeKBxI這個應該是g++的bug?根據expr.prim.lambda/16應該是ok的

Links booklink

Contact Us: admin [ a t ] ucptt.com