枚举所有T </t>的所有SomeClass <t>对象

时间:2011-11-07 08:34:38

标签: c++ events templates

我有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>类中的所有事件?

1 个答案:

答案 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。如果您觉得必须将它们放在那里,我可以帮助删除这些静电。