在此代码示例中使用了哪种模板专门化

What kind of template specialization is used in this code sample?

本文关键字:专门化 代码      更新时间:2023-10-16

我读过关于类模板的显式专门化和类模板的部分专门化的文档,但不明白在这个例子中使用了什么样的专门化(msdn链接只是由于我目前的环境而使用的,这个问题或多或少是理论上的)。我需要在c++标准和/或文档或引用c++标准段落的链接中使用的名称。我试图解决的问题非常复杂,无法直接提出,但我有一个想法,如何使用与本示例中使用的方法类似的方法。

template<class T>
struct is_vector {
    static bool const value = false;
};
template<class T>
struct is_vector<std::vector<T>> {
    static bool const value = true;
}; 

这定义了一个(主)类模板is_vector<T>,然后为T = std::vector<U>部分特化它。

一般规则相当简单:

主模板:

template <something here> class someName /*no angle barckets here */ { ... }
部分专业化:

template <something here> class someName<otherThing here> { ... }

明确专业化:

template <> class someName<something here> { ... }

没有短段的标准来引用,但你可以参考C++11[temp.class.spec]分章。在那一章中没有任何内容将局部特化限制为指针和引用。请注意,您提供的MSDN链接也不限制其范围;示例前面有"such as",但这并不意味着没有其他可能性。

这是部分专门化。您的MSDN链接描述了两种类型的部分专门化,这是第二种:

  1. 模板有多种类型,其中只有一些需要专门化。结果是一个模板参数化其余的类型。
  2. 模板只有一种类型,但指针、引用、成员指针或函数指针类型需要特化。特化本身仍然是指向或引用的类型的模板。

为什么是局部的而不是显式的?因为专门化模板仍然没有完全指定所有类型参数。对于任意类型T的向量,将选择专门化版本。你可以进一步专门化它来处理std::vector ——这将是一个显式特化。

此外-您的MSDN链接显式专门化说"使用部分专门化…当你想要专门化一整组类型的行为时,比如所有的指针类型、引用类型或数组类型。"such as"的使用清楚地表明这个列表并不详尽。匹配向量是另一个"完整的类型集"