C ++专用于类的空模板

时间:2016-04-19 07:34:06

标签: c++ quantlib

在QuantLib中,我找到了这段代码:

//! specialization of null template for this class
    template <>
    class Null<Array> {
      public:
        Null() {}
        operator Array() const { return Array(); }
    };

任何人都知道这是关于什么的?这段代码的目的是什么?如果你有关于这个问题的资源我也很感兴趣。谢谢

3 个答案:

答案 0 :(得分:3)

Null值用于表示缺失值。

例如,当你得到一个QL :: Real r时,你可以很容易地检查它是否为空值:

if(r == Null<Real>())

Array的特化被广泛用作将Array作为可选参数的函数中的默认值。

答案 1 :(得分:2)

  

我猜可以在某处定义Null类,在这里我们用Array初始化它。

几乎正确。在某处定义了Nulltemplate,带有类型参数。在这里我们specialize模板,以便每当使用Array类型实例化模板时,将使用此定义而不是原始定义。

至于Null的用途,请参阅documentation

  

模板类为给定类型提供空值。

答案 2 :(得分:1)

user2079303和jimifiki的答案都是正确的。我添加这个答案只是为了提供一些上下文。

Null类模板用于添加类似于Python中None的空值,并且在我们想要检测时(无论出于何种原因)用作默认参数调用者没有传递一个值,而不是显式传递一个&#34; null&#34;如果我们今天编写代码,我们可能会转而使用boost::optional(很快就会成为std::optional),它会提供更清晰的语义和明确的nil宾语。但是,我们会保留Null以避免破坏客户端代码。

对于算术类型,该事物的工作原理是提供Null特化,当转换为数字时,给出一个不太可能作为合法值传递的特征(至少在调用的上下文中) );即,最大可用int或float取决于类型。对于Array,这并不适用:如您所见,Null<Array>()转换为空Array,代码无法与空{{1}区分开来实例明确传递。但是,有人可能会争辩说空数组本身就是一个空值(即,通过传递一个空数组,即使您传递Array实例,也不会传递任何值这样就可以了; Array类也是如此,它的Date特化返回了一个空状态。