如何阅读模板部分专业化?

Alw*_*ing 3 c++ templates partial-specialization c++11

假设以下声明:

template <typename T> struct MyTemplate;
Run Code Online (Sandbox Code Playgroud)

以下部分特化的定义似乎使用相同的字母T来表示不同的类型.

template <typename T> struct MyTemplate<T*> {};
Run Code Online (Sandbox Code Playgroud)

例如,让我们进行具体的实例化:

MyTemplate<int *> c;
Run Code Online (Sandbox Code Playgroud)

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

template <typename T> struct MyTemplate<T*> {};
Run Code Online (Sandbox Code Playgroud)

在这一行的第一部分(即template <typename T>),Tint *.在线的第二部分(即MyTemplate<T*>),Tint!

那么,部分专业化的定义如何读取?

Ker*_* SB 6

像这样读:

  1. 主模板说," MyTemplate是一个类型参数类模板":

    template <typename> struct MyTemplate;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 偏特说,"只要存在一类T" ......

    template <typename T>
    
    Run Code Online (Sandbox Code Playgroud)

    ......因此MyTemplate要求对T *"...... "类型进行专门化

    struct MyTemplate<T *>
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 您还可以定义显式特化.例如,可以说"无论何时为类型请求特化X,请使用此替代定义:

    template <> struct MyTemplate<X> { /* ... */ };
    
    Run Code Online (Sandbox Code Playgroud)

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

以另一种方式看待它:部分类模板特化推断模式匹配类模板参数的结构:

template <typename T> struct MyTemplate<T *>
//       ^^^^^^^^^^^^                  ^^^^^
//       This is a new template        Argument passed to the original class
//                                     template parameter
Run Code Online (Sandbox Code Playgroud)

此新模板的参数名称在结构上与原始类模板的参数的参数进行匹配.

例子:

  • MyTemplate<void>:类模板的类型参数是void,主模板用于此专门化.

  • MyTemplate<int *>:类型参数是int *.存在一种类型T,即T = int,所请求的类型参数是T *,因此模板的部分特化的定义用于该特化.

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