24 февр. 2007 г.

No more visitor

Когда хочется обойти все объекты определённого типа в иерархии то обычно делают Visitor. Меня он не вставил.
Собственно вот мое видение решения:

template
class wInstancer
{
protected:
static std::list m_instances;
public:
wInstancer(void)
{
m_instances.push_back(static_cast(this));
}
wInstancer(const wInstancer&)
{
m_instances.push_back(static_cast(this));
}
wInstancer(bool) {} //do nothing

//iterator interface
typedef typename std::list::const_iterator iterator;

static iterator begin(void)
{
return m_instances.begin();
}
static iterator end(void)
{
return m_instances.end();
}

//destructor
virtual ~wInstancer(void)
{
m_instances.remove(static_cast(this));
}
};
template
std::list wInstancer::m_instances;


Пользовать так:

...
class SomeThing: public Parent, public wInstancer
...
...
wInstancer::const_iterator it = wInstancer::begin();
for(; it != wInstancer::end(); ++it)
{
it->method();
}