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>),T是int *.在线的第二部分(即MyTemplate<T*>),T是int!
那么,部分专业化的定义如何读取?
像这样读:
该主模板说," MyTemplate是一个类型参数类模板":
template <typename> struct MyTemplate;
Run Code Online (Sandbox Code Playgroud)在偏特说,"只要存在一类T" ......
template <typename T>
Run Code Online (Sandbox Code Playgroud)
......因此MyTemplate要求对T *"...... "类型进行专门化
struct MyTemplate<T *>
Run Code Online (Sandbox Code Playgroud)
...然后使用模板的替代定义.
您还可以定义显式特化.例如,可以说"无论何时为类型请求特化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,并且已为该参数类型定义了显式特化,因此使用了该参数类型.
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |