2011-11-07 57 views
0

我有Event<T>类事件句柄,其中T是仿函数类型的签名void (*)()(或某些基于类的闭包)。枚举所有SomeClass <T>所有对象T

在下面的代码省略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

看来你正在构建自己的事件处理系统。你有没有考虑过使用[Boost.Signals](http://www.boost.org/doc/libs/release/doc/html/signals.html)? –

回答

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。如果您因为某种原因必须将它们放在那里,我可以帮助删除这些静态信息。

+0

我已经像你写的那样做了。我更喜欢在这里使用集合,因此在我的版本基础中,抽象与ctor包括它在集合和dtor排除,当然,'virtual void shot()= 0'和'static void pullTheTrigger()'。 – ZeroArcan