检测对未知模板对象的修改
Detecting modifications to an unknown template object
我目前正在研究三个自定义指针容器,并且有兴趣检测最基本指针的状态何时更改。
第一个容器 (Host) 是一个类,具有指向模板提供的对象的唯一指针,以及已注册观察者的列表。当它被销毁或模板的数据被修改时,它会告诉每个观察者事件发生了。
第二个容器(观察者)是一个类,它保存一个指向主机的指针和两个 lambda 函数,当主机的模板数据被修改 (doModified) 或删除主机 (doDelete) 时,将调用这两个函数。它在分配主机时注册自身。
第三个容器 (ObserverVector) 是一个向量,它包含可能注册到不同主机的观察器,也可能不注册到不同的主机。它将自己的函数插入到观察者的 lambda 函数中,以便在删除主机时清除,并在修改主机时进行自我维护。
实现doDelete很简单,但我在实现doModified时感到困惑。我最初想要的是找出何时调用模板的赋值运算符,但这不适合任何可以通过非默认运算符的函数修改的对象。我目前最好的解决方案是仅将容器与我使用 IsModified lambda 成员定义的类一起使用,在每个修改函数中调用该成员,并让 Host 将其函数之一插入该成员。不过,如果我在整个代码库中使用它,这将是一件苦差事。
我不在 ObserverVector中使用常规弱指针的主要原因是性能问题:对于游戏中的每个时钟周期,我可能会(并且不可避免地)多次阅读每个 ObserverVector 的整个容器。我知道我正在处理一个固有的 O(n*log(n)) 问题,因此减少有效性检查将在这方面帮助我。实现一种在游戏时钟周期结束时扫描的迭代垃圾收集形式是我的最终目标:我想在下一个游戏时钟周期之前的超长时间内隐藏矢量大小调整和重新排序。
长话短说:我想知道是否有一种不那么冗长和侵入性较小的解决方案来确定何时修改包含的数据,同时仍然保持其通用性。
我认为没有比你提出的更好的解决方案了。不过,您可以通过定义一个基类来处理附加和调用doModified
回调来减少样板代码。然后,您只需要从该类继承并为每个突变器添加一个函数调用。
例如
class Modifiable
{
public:
addObserver(Observer& observer) { /*...*/ }
protected:
isModified() { /* Invoke callbacks */ }
private:
// Member(s) to manage callback list
}
class Foo : public Modifiable
{
public:
void set_value(/*...*/)
{
// Change some member data...
isModified();
}
// ...
}
如果您希望Host
能够存储未编写的类型,则必须为每个此类类型编写一个包装类。
我想知道是否创建一个管理器类,该类是围绕主机和观察器的单例包装器,该管理器类具有接受您的第三个容器作为输入的成员函数。这样,封装主机和观察者的经理类会为你做所有的检查,而你的类只做他们需要的工作。因此,如果删除了主机,它将向管理器类报告,管理器类将获取该报告并将其分散到所有包含的观察者或观察者向量。换句话说,此管理器类将执行所有处理,以检查行为和簿记的变化,同时让包含的类仅执行它们需要的工作。
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 使用可变允许修改unordered_set中的对象
- 未定义的对象(〔basic.life〕/8):为什么允许引用重新绑定(和常量修改)
- 如何修改函数中的对象?
- 结构对象的指针成员在传递给函数时被修改
- 修改多线程应用程序中的对象
- 通过引用在矢量中放置和修改对象
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- 如何修复对象在释放后可能修改的malloc错误
- const 方法使用引用修改对象
- C++ API:修改内部对象
- C++ 在其自己的类中创建对象的修改副本
- 打印/修改类对象的特定成员变量,其类定义列表 (STL) 包含的元素类型
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 在C 向量中修改对象值的麻烦
- 使用基对象修改/访问派生类的信息的有问题的设计
- 对象修改通知
- 从c++中GUI中创建的对象修改GUI
- 将等待多个对象修改*多个*对象的状态