给定一个类,有几个成员变量必须在修改引用变量时更新。我想boost::signal
用来帮助更新所有因变量。
这是代码。
#include <functional>
#include "boost/signal.hpp"
#include "boost/ref.hpp"
#include "boost/bind.hpp"
template<class T>
class AutoElement
{
public:
AutoElement(T t) : m_element(t) {}
typedef boost::function<void () > Handler;
void Register(Handler h)
{ m_signal.connect(h); }
void operator() ()
{ m_signal(); }
void SetElement(T t)
{ m_element = t; }
T GetElement() const
{ return m_element; }
private:
T m_element;
boost::signal<void ()> m_signal;
};
class AutoUpdateClass
{
public:
AutoUpdateClass() : m_iBase(0)
{
m_iBase.Register(boost::bind(&AutoUpdateClass::UpdateNumber,
boost::ref(*this)));
m_iBase(); // trigger handler(s)
}
void UpdateBase(int b)
{
m_iBase.SetElement(b);
m_iBase(); // trigger handler(s)
}
private:
void UpdateNumber() // m_iNumber is depended on m_iBase
{ m_iNumber = m_iBase.GetElement() * 2; }
private:
AutoElement<int> m_iBase; // the reference variable
int m_iNumber; // the variable depends on m_iBase
};
int main()
{
AutoUpdateClass auc;
// first m_iBase will be set and then m_iNumber will be updated.
auc.UpdateBase(40);
}
Question> 这个设计有没有潜在的问题?有没有更好的方法来完成这种任务?