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