2014-09-01 18 views
0

現在我想寫一個可以實例化類的通用模板,當然這些類可能沒有或多個參數。所以模板必須有可變參數。任何人都可以幫助我?如何構造類的構造函數可能有多個參數或模板中沒有?

爲了更好地讓自己的理解,請參閱follwong簡單的代碼片段,我不知道如何使它發揮作用:

class Print 
{ 
public: 
    Print(const char* param, const char* param2) 
     : m_str1(param) 
     , m_str2(param2) 
    {} 
    void outPut() 
    { 
     std::cout << m_str1 << "\t" << m_str2 << std::endl; 
    } 
private: 
    std::string m_str1; 
    std::string m_str2; 
}; 

template<typename ... Ts> 
struct adapter 
{ 
    static void invoke() 
    { 
     C t((Ts::value)...); // make a instance on the fly 
    } 
}; 

更新: 當我嘗試寫這樣的代碼,它不會編譯:

adapter<const char*, const char*>; 
+0

你看到什麼問題? – 2014-09-01 03:06:23

+0

@VaughnCato,看到我的更新 – Triumphant 2014-09-01 03:10:17

+0

看起來你正在試圖創建一個'Ts'類型的任意實例,但我懷疑你想要真正的值。如果'Ts'是'const char *',你想要字符串值是什麼?有一個更完整的問題示例(使用主數據庫)可能會使您更清楚您要做什麼。 – 2014-09-01 03:13:57

回答

1

您正在尋找這樣的事情:

template<typename T> 
struct adapter 
{ 
    template<typename ... Ts> 
    static T invoke(Ts&& ... ts) 
    { 
     return T(std::forward<Ts>(ts)...); // make a instance on the fly 
    } 
}; 

要創建類型爲T的對象,請使用適當的參數調用adapter<T>::invoke

+0

固定。您還需要包含標頭''。 – Pradhan 2014-09-01 03:20:05

+0

還有一個問題,如果我刪除'&&',該怎麼辦?它仍然可以編譯。 '&&'有什麼用? – Triumphant 2014-09-01 03:33:01

+1

利用C++ 11的參考摺疊規則,允許rvalue和lvalue綁定到函數參數。 'std :: forward'確保這些信息被正確地轉發到下一個函數。 – Pradhan 2014-09-01 03:54:03

相關問題