Compare commits

...

3 Commits

Author SHA1 Message Date
文佳鹏 a9ae966337
Merge e6cb6093d7 into bd897729f5 2024-02-20 06:05:41 -08:00
Yangtze bd897729f5
Update ReadMe.md (#74) 2024-02-19 23:30:33 -08:00
文佳鹏 e6cb6093d7
深入理解偏特化内容 update
rt
2020-07-08 14:57:24 +08:00
1 changed files with 5 additions and 5 deletions

View File

@ -18,7 +18,7 @@
- [2.2.2. Class Template的与成员变量定义](#222-class-template的与成员变量定义)
- [2.2.3. 模板的使用](#223-模板的使用)
- [2.2.4. 类模板的成员函数定义](#224-类模板的成员函数定义)
- [2.3. 函数模板 (Function Tempalte) 入门](#23-函数模板-function-tempalte-入门)
- [2.3. 函数模板 (Function Template) 入门](#23-函数模板-function-template-入门)
- [2.3.1. 函数模板的声明和定义](#231-函数模板的声明和定义)
- [2.3.2. 函数模板的使用](#232-函数模板的使用)
- [2.4. 整型也可是Template参数](#24-整型也可是template参数)
@ -300,7 +300,7 @@ void vector<T> /*看起来像偏特化*/ ::clear() // 函数的实现放在这
}
```
## 2.3. 函数模板 (Function Tempalte) 入门
## 2.3. 函数模板 (Function Template) 入门
### 2.3.1. 函数模板的声明和定义
@ -1817,18 +1817,18 @@ DoWork<int> i; // (4)
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++
// 以下为伪代码
TemplateDict[DoWork<T>] = {
TemplateSpecDict[DoWork<T>] = {
DoWork<int>,
DoWork<float>,
DoWork<U*>
};
```
然后 (4) 试图以`int`实例化类模板`DoWork`。它会在`TemplateDict`中,找到`DoWork`,它有一个形式参数`T`接受类型,正好和我们实例化的要求相符合。并且此时`T`被推导为`int`。(5) 中的`float*`也是同理。
然后 (4) 试图以`int`实例化类模板`DoWork`。它会在`TemplateSpecDict`中,找到`DoWork`,它有一个形式参数`T`接受类型,正好和我们实例化的要求相符合。并且此时`T`被推导为`int`。(5) 中的`float*`也是同理。
```C++
{ // 以下为 DoWork<int> 查找对应匹配的伪代码