看到為什麼不用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
觀念不見得都對 有錯請幫訂正 謝謝