可以看到,我们在第二个参数使用了缺省类型 int,那么怎么证明缺省类型可以使用呢?我们设计了下面一
个测试用例:
1.
239: data<
int
,
int
> m(2);
2.
004013BD push 2
3.
004013BF lea ecx,[ebp-10h]
4.
004013C2 call @ILT+5(data<
int
,
int
>::data<
int
,
int
>) (0040100a)
5.
004013C7 mov dword ptr [ebp-4],0
6.
240: data<
int
> n(3);
7.
004013CE push 3
8.
004013D0 lea ecx,[ebp-14h]
9.
004013D3 call @ILT+5(data<
int
,
int
>::data<
int
,
int
>) (0040100a)
上面的代码定义了两个临时变量,其中第一个是 m,输入类型是 int;第二个临时变量是 n,输入类型是 int
和 int。前面我们说过缺省类型是 int,那么第一个临时变量 m 和第二个临时变量 n 的构造函数地址应该是一样
的。那么事实上两者的构造函数是不是一样的呢?我们可以查看两者的函数地址,发现一个是 0x0040100a,
另外一个也是 0x0040100a
。范例证明我们的判断是正确的。
明白了上面的缺省模板构造,下面我们谈一下特化模板。特化模板是什么意思呢?其实并不复杂。因为模板
类既然是通用模板,那么其中的数据类型可以是任意数据类型,但是难免有一些数据类型(比如说指针),
我们需要对其中的一些操作做一些细微的修改,但是这些小的修改在原来的模板定义上是无法做的。那么怎么
办?我们只好重新定义一种形式,它和模板类定义的名称一致,但是形式稍有差别。我们可以编写一个测试看
看:
1.
template <typename type>
2.
class data
3.
{
4.
public:
5.
data() {printf("normal!\n");}
6.
~data() {printf("~normal!\n");}
7.
};
8.
9.
template <>
10.
class data<
int
*>
11.
{
12.
public:
13.
data() {printf("point!\n");}
14.
~data() {printf("point!\n");}
15.
};
上面的代码定义了两个类模板。但是两者的名称是一样的,说明这两个类定义的内容其实具有很大的相似性。
第一种定义就是标准模板类的定义,第二中稍微复杂一点,使用缺省的 int*,因为没有使用到特定的 type 类