2011-11-07 29 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