クラスを指定すると、参照変数が変更されるたびに更新する必要があるメンバー変数がいくつかあります。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);
}
質問> この設計に潜在的な問題はありますか? この種のタスクを実行するためのより良い方法はありますか?