看到为什么不用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
观念不见得都对 有错请帮订正 谢谢