【问题标题】:Detecting modifications to an unknown template object检测对未知模板对象的修改
【发布时间】:2016-07-16 05:50:02
【问题描述】:

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

第一个容器(主机)是一个类,它具有指向模板提供的对象的唯一指针,以及已注册的观察者列表。当它被销毁或模板的数据被修改时,它会告诉每个观察者事件发生了。

第二个容器 (Observer) 是一个类,它包含一个指向主机的指针和两个 lambda 函数,当主机的模板数据被修改 (doModified) 或主机被删除 (doDeleted) 时会调用这些函数。当它被分配一个主机时,它会自行注册。

第三个容器 (ObserverVector) 是一个向量,它包含可能注册到也可能未注册到不同主机的观察者。它将自己的函数插入到 Observers 的 lambda 函数中,以便在删除主机时进行清除,以及在修改主机时进行自我维护。

实现 doDeleted 很简单,但我很难实现 doModified。我最初想要的是找出何时调用模板的赋值运算符,但这不适合任何可以通过非默认运算符的函数修改的对象。我目前最好的解决方案是仅将容器与我使用 IsModified lambda 成员定义的类一起使用,在每个修改函数中调用该成员,并让主机将其中一个函数插入该成员。如果我在整个代码库中都使用它,这将是一件苦差事。

我没有在 ObserverVector 中使用常规弱指针的主要原因是性能问题:我可能会(并且不可避免地)在游戏中的每个刻度上多次读取每个 ObserverVector 的整个容器。我知道我正在处理一个固有的 O(n*log(n)) 问题,因此减少有效性检查将在这方面帮助我。我的最终目标是实现一种在游戏滴答结束时清除的迭代垃圾收集形式:我想在下一个游戏滴答之前的多余时间内隐藏矢量调整大小和重新排序抖动。

长话短说:我想知道是否有一种更简洁、更少干扰的解决方案来确定包含的数据何时被修改,同时仍保持其通用性。

【问题讨论】:

    标签: c++ templates pointers


    【解决方案1】:

    总的来说,我认为没有比您提出的解决方案更好的解决方案了。不过,您可以通过定义一个基类来处理附加和调用doModified 回调来减少样板代码。然后,您只需要从该类继承并为每个 mutator 添加一个函数调用。

    例如,

    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();
        }
        // ...
    }
    

    如果您希望您的Hosts 能够存储您未编写的类型,则必须为每个此类类型编写一个包装类。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-26
        • 2020-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-17
        相关资源
        最近更新 更多