【发布时间】:2014-11-16 07:30:56
【问题描述】:
我目前有一个类相当于:
template <class T>
class MyContainer
{
public:
MyContainer():
_value()
{
}
T DoSomething();
private:
T _value;
};
我想这样做,以便我可以将初始值作为模板参数输入,如下所示:
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<int>和MyContainer<int, 43>是完全不同的类型。这意味着如果你有一个std::vector<MyContainer<int>>你不能在没有转换运算符的情况下向这个容器添加一个MyContainer<int, 43>/构造函数。模板参数不应仅用于提供本质上是构造函数参数的内容;只需使用constexpr构造函数。 -
您不能将
std::string用作非类型参数。 -
@RSahu 但他可以使用类型列表和用户定义的文字 +
decltype来模拟它