Template Class,C++的默认值

use*_*688 3 c++ templates

有没有办法为模板类提供默认值?

比如说我有一个类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,doublestring.我想过简单地编写3个单独的TimeSeries类,但这似乎是一个有缺陷的方法.

我对其他想法持开放态度.

眠りネ*_*ネロク 8

您可以声明以下模板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.