我現在有一類就是等價於:模板類可選擇將初始值作爲模板參數
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這樣的「非平凡析構函數」的類。我正在努力做到這一點,有沒有辦法解決這個問題。
這是不大可能奏效超出你想要的方式; 'MyContainer'和'MyContainer '*是完全不同的類型*這意味着如果你有一個'std :: vector >'你不能*添加一個MyContainer ' /構造。模板參數不應該僅用於提供實質上構造函數的參數;只需使用'constexpr'構造函數即可。 –
cdhowie
您不能使用'std :: string'作爲非類型參數。 –
@RSahu但他可以用一個類型串和定義文字+'用戶模擬它decltype' – Manu343726