2014-02-16 105 views
0

我試圖設計一個工廠類,允許我用任意數量的構造函數封裝任何類的構造(已從相同的基類「Base」派生)參數。目前的設計只支持一個或零構造函數的參數:工廠類與構造函數的可變參數模板參數

class FactoryBase 
{ 
public: 
    FactoryBase(std::string id) : id_(id) {} 
    virtual ~FactoryBase(){} 
    virtual Base* create() const = 0; 
    std::string getId() const { return id_; } 
protected: 
    std::string id_; 
}; 

template<class T, typename A> //One argument 
class Factory : public FactoryBase 
{ 
public: 
    Factory(std::string id, A arg) : FactoryBase(id), arg_(arg) {} 
    Base* create() const { return new T(arg_); } 
private: 
    A arg_; 
}; 

template<class T> //zero arguments/default ctor 
class Factory<T,void> : public FactoryBase 
{ 
public: 
    Factory(std::string id) : FactoryBase(id) {} 
    Base* create() const { return new T(); } 
}; 

我可以只添加一個模板特供的參數每個數字,但我想學習如何做「porperly」。

+0

我們回來了! :-) – 0x499602D2

+0

是的,無法修復「variadric」到variadic,讓我瘋狂 – jms

+0

不應該在基類中使用':FactoryBase(id){}':'id_(id)'? – 0x499602D2

回答

0

從我在duplicate中給出的信息中,您需要將參數的類型存儲在類型列表中。在C++ 11中,這將是std::tuple。你的類模板應該放入一個參數包,放入這個元組中。

該構造函數應該是一個模板構造函數,它接受一個參數包,然後將其轉發給元組數據成員的構造函數。

編譯時整數序列生成器可用於訪問create()內的元組的每個元素(請參見副本中的確切代碼)。

+0

是否有可能從構造函數參數中推導出'Factory'類型?我希望能夠執行以下操作:'工廠 fac1(「ID123」,「arg0」,1.56,4);'而不是Factory fac2(「ID123」,「arg0」,1.56,4);'。 – jms

+0

當然像'工廠 fac1 = makeFactory (「ID123」,「arg0」,1.56,4);'會工作,但一個適當的construcor將是整潔,而不是一些外部功能。 – jms

+0

@ user1062874對不起,但爲了構造函數的工作類型必須事先知道。這是因爲元組數據成員需要在將參數傳遞給其構造函數之前指定類型。這就是爲什麼我建議製作一個輔助函數,從其參數中推導出類型。 – 0x499602D2

相關問題