2014-05-25 86 views
1

我爲我正在開發的一個項目編寫了一個基於模板的工廠系統。這些都是一些函數模板我有簽名:編寫一個基於模板的工廠系統

template <typename Interface, typename... Args> 
void register_factory(identifier id, function<shared_ptr<Interface> (Args...)> factory); 

template <typename Interface, typename... Args> 
void unregister_factory(identifier id); 

template <typename Interface, typename... Args> 
shared_ptr<Interface> create(identifier id, Args... args); 

正如你看到的,我給我所有的功能模板typename... Args的說法,因爲我需要訪問我在其中存儲工廠函數變量:

template <typename Interface, typename... Args> 
struct factory_storage { 
    static map<identifier, function<shared_ptr<Interface> (Args...)> factories; 
}; 

但是從邏輯上講,我應該只需要那些register_factorycreate,其他地方知道Interface應該足夠了(爲同一接口的所有工廠函數具有相同的簽名)。事實上,如果我使用void*而不是std::function,我可以在我的代碼中刪除大多數出現的typename... Args

有沒有一種方法可以保持std::function的型號安全,同時也避免了一些混亂。我已經看到std::tuple用於存儲typename...參數,這些可能是我的問題的一種可能的解決方案,但它們看起來過於複雜,我希望能夠避免它們。

+0

[這可能是相關的],我用它來解決(http://stackoverflow.com/questions/18251815/creating-an-array-initializer-from-a-tuple-or-variadic-template-parameters),我用它來解決類似的問題。 –

+0

由於用戶必須記住'id'和'Args'類型之間的匹配,是否有意義返回基於'Interface'和'Args'的模板類ID而不是簡單的'identifier id'? – Jarod42

+0

在任何情況下,我都需要創建一個'std :: function (Args ...)'函數類型。如果我沒有收到Interface和Args作爲模板參數,我怎麼能構造這種類型? – Elektito

回答

1

如果std::function的簽名數量是固定的,variant(作爲Boost中的一個)是一個可能的解決方案。

+0

恐怕並非如此。這是一個圖書館,我無法控制它將來如何使用。 – Elektito