首页 > 解决方案 > 跟踪对象更改的方法

问题描述

我有MyClass可以通过调用修改的类setX。我想知道一个对象MyClass是否已通过调用isChanged.

在下面的代码中,我不喜欢在每个可以改变对象状态的方法中添加setDirty或。m_dataChanged

class ChangesHolder
{
private:
  bool m_isChanged;
  // boost::signals2::signal<void()> m_dataChanged;
  // long m_stamps;

public:
  ChangesHolder()
    : m_isChanged{false}
    // , m_stamps{0}
  {
    // m_dataChanged.connect(std::bind(&ChangesHolder::setDirty, this));
  }

  bool isChanged() const
  {
    return m_isChanged;
    // return (m_stamps == 0);
  }

  void resetChanges()
  {
    m_isChanged = false;
    // m_stamps = 0;
  }

protected:
  void setDirty()
  {
    m_isChanged = true;
    // ++m_stamps;
  }
}

class MyClass : public ChangesHolder
{
private:
  int m_x;

public:
  void setX(int x)
  {
    if (m_x != x)
    {
      m_x = x;
      setDirty();
      // m_dataChanged();
    }
  }
}

我想注册这样的方法:

template<typename ... Funcs>
void startTrack(Funcs ... funcs)
{
  auto connect = [&](auto func)
  {
    // connect func to setDirty
  };
  do_foreach(connect, funcs ...);
}

MyClass::MyClass()
{
  startTrack(&MyClass::setX, &MyClass::setY);
}

如何做到这一点,或者也许还有其他方法可以做到这一点?

标签: c++

解决方案


推荐阅读