C_and_CPP 板


LINE

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



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 213.127.105.210
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1532809476.A.087.html
1F:推 soheadsome: 简单说 感觉你想做c#的delegate 07/29 08:12
2F:推 KanzakiHAria: 你会无法用是因为一开始就是用c style而非OO的概念 07/29 08:16
想不太到用OO的概念要怎麽好做Add跟Remove callback的实作...记忆体位置太方便
3F:推 soheadsome: 而且你的型态跟callback在compile time都决定好了 没 07/29 08:23
4F:→ soheadsome: 办法用std::visit解决? 07/29 08:23
std::visit太新了还没研究过...
5F:推 lovejomi: 题外话,为什麽Icallback会想用private继承? 有什麽好 07/29 08:51
6F:→ lovejomi: 处吗这里 07/29 08:51
Effective C++某章的内容,虽然语意上用public才是对的,但是用private可以避免使用者 直接建立这个物件然後可以呼叫他的ICallback成员函式
7F:推 lovejomi: 另外你是问说要是addcallback不是吃Icallback而是收std 07/29 08:58
8F:→ lovejomi: function 该怎麽做到remove callback吗 07/29 08:58
对因为用ICallback的传统写法this是唯一的, 但是bind出来的std::function照我的理解 出来的值不会是唯一
9F:推 soheadsome: std::optional加上std:: function做不到? 07/29 11:32
不太懂这个意思, 只是取代pointer版Add应该可以, 但是取代我的例子Remove应该不行 ※ 编辑: boy770329 (213.127.105.210), 07/29/2018 15:43:50







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP