【发布时间】:2016-09-22 08:09:29
【问题描述】:
我正在尝试用 C++ 编写一个观察者模式 所以我有一个包含 eventname -> 回调函数向量的地图
回调函数存储在一个向量中
std::function<void(void *)>
所以地图看起来像
std::unordered_map<std::string, std::vector<std::function<void(void *)>>>
我可以将侦听器添加到向量并接收和响应事件通知。我的问题是实现分离。
所以std::function不能比较,所以erase/remove就出来了,所以我想搜索vector并手动比较。
我发现 this question 成功使用 std::function::target 访问底层指针,但我不能使用它,因为我正在使用 std::bind 来初始化回调:
std::function<void(void *)> fnCallback = std::bind(&wdog::onBark, this, std::placeholders::_1)
我只想比较底层的成员函数ptr,甚至是和该成员函数关联的底层对象ptr比较。有什么办法吗?
我想避免将成员 fn ptr 包装在包含哈希的对象中,尽管看起来我可能不得不这样做......
【问题讨论】:
-
您能否发布一个有关如何从地图中添加/删除项目的示例?
-
在我看来你已经知道答案了... :-)
-
如果不存储指向相关对象的指针以用作键,您就无法真正做到这一点。我的 impl 使用weak_ptr 并在发送事件之前检查集合以删除 expired() 。附加是 (shared_from_this(), &class::member),分离是 (shared_from_this())。
-
示例太长(模板和多个文件),对不起 Holt。
标签: c++ c++11 vector std-function