2014-11-16 96 views
4

我現在有一類就是等價於:模板類可選擇將初始值作爲模板參數

template <class T> 
class MyContainer 
{ 
public: 
    MyContainer(): 
    _value() 
    { 
    } 

    T DoSomething(); 

private: 
    T _value; 
}; 

我想使它這樣我可以作爲一個模板參數進入inital值,如下所示:

template <class T> constexpr T GetInital() 
{ 
    return 0; 
} 

template <> constexpr std::string GetInital() 
{ 
    return ""; 
} 

template <class T, T initial = GetInital<T>()> 
class MyContainer 
{ 
public: 
    MyContainer(): 
    _value(initial) 
    { 
    } 

    T DoSomething(); 

private: 

    T _value; 
}; 

MyContainer<std::string> string_container; // initalized to "" 
MyContainer<std::string, "hello"> string_container2; // initalized to hello 
MyContainer<int> int_container; // initalized to 0 
MyContainer<int, 43> int_container; // initalized to 43 

但它不喜歡像std :: string這樣的「非平凡析構函數」的類。我正在努力做到這一點,有沒有辦法解決這個問題。

+4

這是不大可能奏效超出你想要的方式; 'MyContainer '和'MyContainer '*是完全不同的類型*這意味着如果你有一個'std :: vector >'你不能*添加一個MyContainer ' /構造。模板參數不應該僅用於提供實質上構造函數的參數;只需使用'constexpr'構造函數即可。 – cdhowie

+0

您不能使用'std :: string'作爲非類型參數。 –

+0

@RSahu但他可以用一個類型串和定義文字+'用戶模擬它decltype' – Manu343726

回答

3

只寫一個構造函數重載做初始化,它正是它是專爲。

正如其他注意到,模板參數的每個組合產生一個完全不同的類型。 (?編譯時類型擦除),並討論可能的解決方案是無意義的由C++的基本特徵之一蓋好的情況:構造

template <class T> 
class MyContainer 
{ 
public: 
    MyContainer(): 
    _value() 
    { 
    } 

    MyContainer(const T& init): 
    _value(init) 
    { 
    } 

    T DoSomething(); 

private: 
    T _value; 
}; 

MyContainer<std::string> string_container;   // initalized to "" 
MyContainer<std::string> string_container2{"hello"}; // initalized to hello 
MyContainer<int> int_container;      // initalized to 0 
MyContainer<int> int_container{43};     // initalized to 43 

如果你想要的是一個typedef其實例總是初始化爲您指定的值,只寫一個工廠函數:

template<typename T> 
auto make_factory(const T& init) 
{ 
    return [=](){ return MyContainer<T>{ init }; }; 
} 

int main() 
{ 
    auto factory = make_factory<std::string>("hello"); 

    auto c1 = factory(); //c1 initialized to hello 
    auto c2 = factory(); //c2 initialized to hello 
} 

其實,make_factory()是工廠的廠...

+0

':_value()'是隱含在默認情況下,空實現,不是嗎? –

+0

@BartekBanachewicz是的。我是Rule Of Zero的忠實粉絲,但我只是修改了OP的內容。即使你編寫它,也更喜歡'MyContainer()= default;' – Manu343726