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

时间:2014-03-13 10:56:34

标签: c++ templates template-specialization generic-programming

我已阅读有关Explicit Specialization of Class TemplatesPartial Specialization of Class Templates的文档,但不明白本例中使用的是什么类型的专业化(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;
}; 

2 个答案:

答案 0 :(得分:2)

这定义了一个(主要)类模板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链接不会将其范围限制为它们;它说&#34;比如&#34;在例子之前,这并不意味着没有其他可能性。

答案 1 :(得分:1)

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

  1. 模板有多种类型,其中只有一些需要专门化。结果是在剩余类型上参数化模板。
  2. 模板只有一种类型,但指针,引用,指向成员的指针或函数指针类型需要特化。专门化本身仍然是指向或引用的类型的模板。
  3. 为什么它偏袒而不明确?因为专用模板仍未完全指定其所有类型参数。将为任何类型T 的矢量选择专用版本。您可以进一步专门化它来处理std :: vector&lt; int&gt; - 这将是一个明确的专业化。

    此外 - 用于显式特化的MSDN链接表示&#34;使用部分特化...当您想要专门化整个类型集的行为时,例如所有指针类型,引用类型或数组类型。&# 34;使用&#39;如&#39;清楚地表明该清单并非详尽无遗。匹配向量的类型集&lt; T>是另一种&#34;整套类型&#34;。

相关问题