检测对未知模板对象的修改

Detecting modifications to an unknown template object

本文关键字:对象 修改 未知 检测      更新时间:2023-10-16

我目前正在研究三个自定义指针容器,并且有兴趣检测最基本指针的状态何时更改。

第一个容器 (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能够存储未编写的类型,则必须为每个此类类型编写一个包装类。

我想知道是否创建一个管理器类,该类是围绕主机和观察器的单例包装器,该管理器类具有接受您的第三个容器作为输入的成员函数。这样,封装主机和观察者的经理类会为你做所有的检查,而你的类只做他们需要的工作。因此,如果删除了主机,它将向管理器类报告,管理器类将获取该报告并将其分散到所有包含的观察者或观察者向量。换句话说,此管理器类将执行所有处理,以检查行为和簿记的变化,同时让包含的类仅执行它们需要的工作。