我有Event<T>
类用于事件句柄,其中T
是标记void (*)()
的仿函数类型(或某些基于类的闭包)。
在下面的代码中,省略了ctor将构造对象复制到地图events
。
template <class T>
class Event
{
...
T action;
long explode;
static map<string, Event> events;
...
void shot()
{
action();
}
...
static void check()
{
// foreach pair in events
if (itsATimeFor(pair->second.explode))
pair->second.shot();
}
};
check()
函数测试是否有任何事件在其漏洞中发生火灾并且成功发射。
当前的实现有一些主要的缺点:它每次调用只测试一种类型的事件,因此是无用的
问题是,如何枚举所有实例化的Event<T>
类中的所有事件?
答案 0 :(得分:3)
我认为你需要一个共同的基类,这意味着你可以将所有这些东西存储在一个集合中。要做到这一点,你必须摆脱static
的东西,但我不认为这是一个问题。
class IEvent
{
public:
virtual ~IEvent() = 0 { };
virtual void check() = 0;
}; // eo interface IEvent
template<class T>
class Event : public IEvent
{
public:
virtual ~Event()
{
}; // eo dtor
void check()
{
};
}; // eo class Event
现在,您可以根据需要实例化Event类并将它们放入集合中。然后,您可以枚举它们并在每个实例上调用check()
。我认为你没有理由在这里使用static
。如果您觉得必须将它们放在那里,我可以帮助删除这些静电。