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 次 |
最近记录: |