有没有办法为模板类提供默认值?
比如说我有一个类TimeSeries,这是模板化的.我有一个叫做Foo()返回的函数T.
template <typename T>
class TimeSeries
{
T foo();
}
Run Code Online (Sandbox Code Playgroud)
我想做Foo()一些计算并返回类型的东西T.但如果它不能,我希望它给出一个默认值.如果T是的话double,我希望如此NaN.如果T是的话int,我希望如此0.
TimeSeries<double> t;
t.foo(); // returns NAN
TimeSeries<int> t;
t.foo(); // returns 0
Run Code Online (Sandbox Code Playgroud)
我怎么做到这一点?
一个糟糕的解决方案是Foo()采用默认值.
template <typename T>
class TimeSeries
{
T foo(T defaultValue)
{
T ret;
// if OK
ret = computeValue();
// if not OK
ret = defaultValue;
return ret;
}
}
Run Code Online (Sandbox Code Playgroud)
所以默认值是0,或者NaN,取决于用户.
或者我首先要求一个有缺陷的设计?
编辑 - 一个合乎逻辑的问题是询问如果T不是int或者会发生什么double.默认值甚至意味着什么?
我使用的方式TimeSeries,T是不完全是一个通用型.它只能是1 int,double和string.我想过简单地编写3个单独的TimeSeries类,但这似乎是一个有缺陷的方法.
我对其他想法持开放态度.
您可以声明以下模板default_value<>:
template<typename>
struct default_value;
Run Code Online (Sandbox Code Playgroud)
然后,为所谓的成员提供完整的特化,int并提供所需的默认值:doublevalue
template<>
struct default_value<int> {
static constexpr int value = 0;
};
template<>
struct default_value<double> {
static constexpr double value = NaN;
};
Run Code Online (Sandbox Code Playgroud)
然后,在您的foo函数模板中,您只需返回该值:
return default_value<T>::value;
Run Code Online (Sandbox Code Playgroud)
这取决于T.