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

时间:2016-07-16 05:50:02

标签: c++ templates pointers

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

我想知道是否创建一个围绕主机的单独包装的Manager类和具有接受第三个容器作为输入的成员函数的观察者。通过这种方式,您的经理类可以封装您的主机&观察者会为您完成所有检查,而您的课程只完成他们需要的工作。因此,如果删除主机,它将向Manager类报告,并且Manager类将获取该报告并将其分散到所有包含的观察者或您的观察者向量中。另一个词,这个Manager类将执行所有处理,检查行为和簿记的变化,同时让包含的类只做他们需要的工作。

答案 1 :(得分:0)

总的来说,我认为没有比你提议的解决方案更好的解决方案。您可以通过定义基类来处理样板代码,以处理附加和调用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();
    }
    // ...
}

如果您希望Host能够存储您没有写过的类型,那么您必须为每种类型编写一个包装类。

相关问题