假设有以下声明:
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
!
那么,部分特化的定义怎么读呢?
像这样读:
-
The 主模板 says "MyTemplate
是一个具有一个类型参数的类模板”:
template <typename> struct MyTemplate;
-
The 部分专业化说:“只要存在一种类型T
"...
template <typename T>
...这样的专业化MyTemplate
要求类型T *
"...
struct MyTemplate<T *>
...然后使用模板的替代定义。
-
您还可以定义明确的专业化。例如,可以说“每当需要类型专业化时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(使用前将#替换为@)