深入理解偏特化内容 update

rt
This commit is contained in:
文佳鹏 2020-07-08 14:57:24 +08:00 committed by GitHub
parent e5e89346b2
commit e6cb6093d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1830,18 +1830,18 @@ DoWork<int> i; // (4)
DoWork<float*> pf; // (5) DoWork<float*> pf; // (5)
``` ```
首先,编译器分析(0), (1), (2)句,得知(0)是模板的原型,(1)(2)(3)是模板(0)的特化或偏特化。我们假设有两个字典,第一个字典存储了模板原型,我们称之为`TemplateDict`。第二个字典`TemplateSpecDict`,存储了模板原型所对应的特化/偏特化形式。所以编译器在处理这几句时,可以视作 首先,编译器分析(0), (1), (2), (3)四句,得知(0)是模板的原型,(1)(2)(3)是模板(0)的特化或偏特化。我们假设有两个字典,第一个字典存储了模板原型,我们称之为`TemplateDict`。第二个字典`TemplateSpecDict`,存储了模板原型所对应的特化/偏特化形式。所以编译器在处理这几句时,可以视作
```C++ ```C++
// 以下为伪代码 // 以下为伪代码
TemplateDict[DoWork<T>] = { TemplateSpecDict[DoWork<T>] = {
DoWork<int>, DoWork<int>,
DoWork<float>, DoWork<float>,
DoWork<U*> DoWork<U*>
}; };
``` ```
然后 (4) 试图以`int`实例化类模板`DoWork`。它会在`TemplateDict`中,找到`DoWork`,它有一个形式参数`T`接受类型,正好和我们实例化的要求相符合。并且此时`T`被推导为`int`。(5) 中的`float*`也是同理。 然后 (4) 试图以`int`实例化类模板`DoWork`。它会在`TemplateSpecDict`中,找到`DoWork`,它有一个形式参数`T`接受类型,正好和我们实例化的要求相符合。并且此时`T`被推导为`int`。(5) 中的`float*`也是同理。
```C++ ```C++
{ // 以下为 DoWork<int> 查找对应匹配的伪代码 { // 以下为 DoWork<int> 查找对应匹配的伪代码