如何读取模板偏特化?

2023-12-03

假设有以下声明:

template <typename T> struct MyTemplate;

以下部分特化的定义似乎使用相同的字母T来指代不同的类型。

template <typename T> struct MyTemplate<T*> {};

例如,我们来看一个具体的实例化:

MyTemplate<int *> c;

现在,再次考虑上面的部分特化的定义:

template <typename T> struct MyTemplate<T*> {};

在该行的第一部分(即template <typename T>), T is int *。在该行的第二部分(即MyTemplate<T*>), T is int!

那么,部分特化的定义怎么读呢?


像这样读:

  1. The 主模板 says "MyTemplate是一个具有一个类型参数的类模板”:

    template <typename> struct MyTemplate;
    
  2. The 部分专业化说:“只要存在一种类型T"...

    template <typename T>
    

    ...这样的专业化MyTemplate要求类型T *"...

    struct MyTemplate<T *>
    

    ...然后使用模板的替代定义。

  3. 您还可以定义明确的专业化。例如,可以说“每当需要类型专业化时X,使用这个替代定义:

    template <> struct MyTemplate<X> { /* ... */ };
    

请注意,类模板的显式特化定义类型,而部分特化定义模板。

从另一个角度来看:部分类模板专业化deduces, or 模式匹配,类模板参数的结构:

template <typename T> struct MyTemplate<T *>
//       ^^^^^^^^^^^^                  ^^^^^
//       This is a new template        Argument passed to the original class
//                                     template parameter

这个新模板的参数名称在结构上与原始类模板参数的实参相匹配。

例子:

  • MyTemplate<void>:类模板的类型参数为void,并且主模板用于此专业化。

  • MyTemplate<int *>: 类型参数为int *。存在一个类型T,即T = int,这样请求的类型参数是T *,因此模板的部分特化的定义用于此特化。

  • MyTemplate<X>: 参数类型为X,并且已为该参数类型定义了显式特化,因此使用该参数类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何读取模板偏特化? 的相关文章

随机推荐