2010-06-18 48 views
2

我正在創建事件系統。它基於boost :: signals。爲了使工作更容易,我使用typedef作爲函數簽名。動態創建typedef

在我需要創建一些新事件trought event的系統方法之前,所有東西都是okey。我必須在給定類型上動態創建typedef到模板函數。問題是typedef的名字。

一些僞我會:

template<typename EventType> 
void create(const string &signalName) 
{ 
    typedef EventType signalName; 
    // ... 
} 

是否有可能做出這樣的typedef(自己的名字),還有一些傳遞的字符串或數據或者其他什麼東西?我不想讓用戶在意這一點。


UPD:所以,我有一些類型定義的函數簽名的名單 - 事件。例如,我有一些模板連接插槽的功能。我不想強迫用戶每次都再次用手輸入簽名(用戶是使用事件系統的程序員)。所以我只是使用特殊命名空間中的typedef模板參數。

+3

假設這樣的事情是可能的。你如何設想*使用* typedef一旦你創建它?告訴您的預期用途可能會幫助人們思考替代解決方案。 – 2010-06-18 22:38:24

+0

@ rob-kennedy更新 – Ockonal 2010-06-18 22:42:56

+1

謝謝,但那並沒有真正回答我的問題。我的意思是你應該演示如何調用'create'函數,然後演示如何使用生成的typedef。顯示一些示例代碼,瞭解如何使用此功能。 – 2010-06-18 22:56:34

回答

4

typedefs只在編譯期間很重要。據我所知,這只是一種類型的別名。

+0

是的,我將來需要在這個別名中,在我的功能完成工作之後。 – Ockonal 2010-06-18 22:44:12

3

根據定義,模板參數是編譯時間實體。就我所知,您不能在程序執行期間動態創建模板類。

+0

你是完全正確的。 – 2010-06-18 23:52:09

1

在這種情況下,我不會去typedef的。如果你想有幾種類型的事件並動態地創建它們,你可以使用一個包含事件類型信息的簡單類。當你有一個事件時,你將它鏈接到之前創建的事件類型。

事情是這樣的:

class EventType 
{ 
    private: 
    string type; 

    EventType(string type); 
}; 

class Event 
{ 
    private: 
    string event_name; 
    EventType *event_type; 

    Event(string event_name, EventType event_type); 
}; 

... 

void create(const string &signalName) 
{ 
    EventType *event_type = new EventType("type_x"); 
    Event *event = new Event("event_x", event_type); 
}