1. typename的前世今生
(1) 历史上的原因:
- 早期的C++直接复用class关键字来定义模板
- 但是泛型编程针对的不只是类类型
- class关键字的复用使得代码出现二义性
(2) typename诞生的直接诱因
- 自定义类类型内部的嵌套类型
- 不同类中的同一个标识符可能导致二义性
- 编译器无法辨识标识符究竟是什么
(3) typename的作用:
- 在模板定义中声明泛指类型
- 明确告诉编译器其后的标识符为类型
2. try ... catch
- try...catch 用于分割正常功能代码与异常处理代码
- try...catch 可以直接将函数实现分隔为2部分
- 函数声明和函数定义时可以直接指定可能抛出的异常类型
- 异常声明成为函数的一部分可以提高代码可读性
- 函数异常声明的注意事项
(1) 函数异常声明是一种与编译器之间的契约
(2) 函数声明异常后就只能抛出声明的异常,抛出其它异常将导致程序运行终止,可以直接通过异常声明定义无异常函数
编程说明:新的异常写法
#include <iostream>
#include <string>
using namespace std;
int func(int i, int j) throw(int, char)
{
if( (0 < j) && (j < 10) )
{
return i + j;
}
else
{
throw '0';
}
}
void test(int i) try
{
cout << "func(i, i) = " << func(i, i) << endl;
}
catch(int i)
{
cout << "Exception: " << i << endl;
}
catch(...)
{
cout << "Exception... " << endl;
}
int main()
{
test(5);
test(10);
return 0;
}
输出结果:
func(i, i) = 10
Exception...
3. 小结
-
class
可用来在模板中定义泛指类型(不推荐) -
typename
是可以消除模板中的二义性 -
try...catch...
可以将函数体分为两部分 - 异常声明能够提供程序的可读性