【发布时间】:2016-07-16 05:50:02
【问题描述】:
我目前正在研究三个自定义的指针容器,并且有兴趣检测最基指针的状态何时发生变化。
第一个容器(主机)是一个类,它具有指向模板提供的对象的唯一指针,以及已注册的观察者列表。当它被销毁或模板的数据被修改时,它会告诉每个观察者事件发生了。
第二个容器 (Observer) 是一个类,它包含一个指向主机的指针和两个 lambda 函数,当主机的模板数据被修改 (doModified) 或主机被删除 (doDeleted) 时会调用这些函数。当它被分配一个主机时,它会自行注册。
第三个容器 (ObserverVector) 是一个向量,它包含可能注册到也可能未注册到不同主机的观察者。它将自己的函数插入到 Observers 的 lambda 函数中,以便在删除主机时进行清除,以及在修改主机时进行自我维护。
实现 doDeleted 很简单,但我很难实现 doModified。我最初想要的是找出何时调用模板的赋值运算符,但这不适合任何可以通过非默认运算符的函数修改的对象。我目前最好的解决方案是仅将容器与我使用 IsModified lambda 成员定义的类一起使用,在每个修改函数中调用该成员,并让主机将其中一个函数插入该成员。如果我在整个代码库中都使用它,这将是一件苦差事。
我没有在 ObserverVector 中使用常规弱指针的主要原因是性能问题:我可能会(并且不可避免地)在游戏中的每个刻度上多次读取每个 ObserverVector 的整个容器。我知道我正在处理一个固有的 O(n*log(n)) 问题,因此减少有效性检查将在这方面帮助我。我的最终目标是实现一种在游戏滴答结束时清除的迭代垃圾收集形式:我想在下一个游戏滴答之前的多余时间内隐藏矢量调整大小和重新排序抖动。
长话短说:我想知道是否有一种更简洁、更少干扰的解决方案来确定包含的数据何时被修改,同时仍保持其通用性。
【问题讨论】: