Re: [问题] 什么时后 不该用/该用reference当member

楼主: boy770329 (A-So)   2018-07-29 04:24:30
看到为什么不用std::function刚好我也有这个问题
如果function长这样foo(ICallback &)或foo(ICallback *)
那一个继承ICallback的物件可以在自己的scope内呼叫foo(*this)或foo(this)
假设今天AddCallback是物件CPublisher开给外面注册callback function
该物件提供另外一个移除callback的RemoveCallback
对于一个需要听该事件的物件CSubscriber有个很简单的作法如下
class CSubscriber : private ICallback
{
public:
CSubscriber(const CPublisher& aPub) : mPub(aPub)
{ mPub.AddCallback(*this); }
~CSubscriber() {mPub.RemoveCallback(*this); }
...
private:
const CPublisher& mPub;
}
这个情况下如果把ICallback换成std::function, 的确可以用std::bind搭配this跟某个
member function一样呼叫AddCallback, 但是Remove怎么办? 再bind一次?
原先的做法, 物件CPublisher如果需要存多个Callback, 不管用reference还是pointer都
可以利用内存位置唯一的特色把传进来的东西的内存位置存在某种container内
所以对CSubscriber生成的Object, this在建构跟解构式会是一样的值
但是如果改用std::function跟bind, 原本很方便的这个作法似乎就不能用了
(有跟同事讨论过实作AddCallback return ID存下来, Remove传ID判断但觉得实作太麻烦)
这是我唯一想到会倾向用reference/pointer而不用std::function的情况
至于原本的问题大概就像前面的人回答的,
pointer可以是nullptr, 所以你做一个set既可以设值也可以传nullptr做unset
reference就基本上强迫传存在的东西了, 不考虑local反正用pointer也避免不了外面delete
观念不见得都对 有错请帮订正 谢谢
作者: soheadsome (师大狗鼻哥)   2018-07-29 08:12:00
简单说 感觉你想做c#的delegate
作者: KanzakiHAria (神崎・H・アリア)   2018-07-29 08:16:00
你会无法用是因为一开始就是用c style而非OO的概念
作者: soheadsome (师大狗鼻哥)   2018-07-29 08:23:00
而且你的型态跟callback在compile time都决定好了 没办法用std::visit解决?
作者: lovejomi (JOMI)   2018-07-29 08:51:00
题外话,为什么Icallback会想用private继承? 有什么好处吗这里另外你是问说要是addcallback不是吃Icallback而是收stdfunction 该怎么做到remove callback吗
作者: soheadsome (师大狗鼻哥)   2018-07-29 11:32:00
std::optional加上std:: function做不到?

Links booklink

Contact Us: admin [ a t ] ucptt.com