我爲我正在開發的一個項目編寫了一個基於模板的工廠系統。這些都是一些函數模板我有簽名:編寫一個基於模板的工廠系統
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_factory
和create
,其他地方知道Interface
應該足夠了(爲同一接口的所有工廠函數具有相同的簽名)。事實上,如果我使用void*
而不是std::function
,我可以在我的代碼中刪除大多數出現的typename... Args
。
有沒有一種方法可以保持std::function
的型號安全,同時也避免了一些混亂。我已經看到std::tuple
用於存儲typename...
參數,這些可能是我的問題的一種可能的解決方案,但它們看起來過於複雜,我希望能夠避免它們。
[這可能是相關的],我用它來解決(http://stackoverflow.com/questions/18251815/creating-an-array-initializer-from-a-tuple-or-variadic-template-parameters),我用它來解決類似的問題。 –
由於用戶必須記住'id'和'Args'類型之間的匹配,是否有意義返回基於'Interface'和'Args'的模板類ID而不是簡單的'identifier id'? – Jarod42
在任何情況下,我都需要創建一個'std :: function(Args ...)'函數類型。如果我沒有收到Interface和Args作爲模板參數,我怎麼能構造這種類型? –
Elektito