【发布时间】:2018-07-15 14:03:33
【问题描述】:
有没有办法为模板类提供默认值?
例如假设我有一个类TimeSeries,它是模板化的。我有一个名为Foo() 的函数,它返回T。
template <typename T>
class TimeSeries
{
T foo();
}
我想让Foo() 做一些计算并返回T 类型的东西。但万一它不能,我希望它给出一个默认值。如果T 是double,我希望它是NaN。如果T 是int,我希望它是0。
TimeSeries<double> t;
t.foo(); // returns NAN
TimeSeries<int> t;
t.foo(); // returns 0
我将如何实现这一目标?
一个糟糕的解决方案是让Foo() 采用默认值。
template <typename T>
class TimeSeries
{
T foo(T defaultValue)
{
T ret;
// if OK
ret = computeValue();
// if not OK
ret = defaultValue;
return ret;
}
}
因此默认值为0 或NaN,具体取决于用户。
还是我一开始就要求有缺陷的设计?
编辑 -
一个合乎逻辑的问题是询问如果T 不是int 或double 会发生什么。默认值是什么意思?
我使用TimeSeries、T 的方式并不完全是通用类型。它只能是 int、double 和 string 中的 1 个。
我想过简单地编写 3 个单独的 TimeSeries 类,但这似乎是一种有缺陷的方法。
我对其他想法持开放态度。
【问题讨论】:
-
可以通过多种方式完成。最简单的是
if constexpr (std::is_integral_v<T>) return 0; else return NAN;。 -
如果
T不是double或int,那么默认值是多少? -
我设想
TimeSeries不完全是一个通用类。按照我的使用方式,它只会是TimeSeries<double>、TimeSeries<int>,也许还有TimeSeries<std::string>。当然,我本可以编写 3 个单独的TimeSeries类,但我觉得那会是一个更奇怪的解决方案。