从一个简单的模板函数实例说起
/*implement strcmp-like generic compare function
returns 0 if the values are equal, 1 if v1 is larger, -1 if v1 is smaller*/
template <typename T> /*模版形参表*/
int compare(const T &v1, const T& v2){
return v1 < v2 ? -1 : (v1 = v2 ? 0 : 1);
}
模版形参可以是表示类型的类型形参,也可以是表示常量表达式的非类型形参。
实例化:编译器根据模板实参bind到模版形参的过程
内联函数模版
inline
放在函数声明之前,而不是模版形参表之前
泛型编程与容器
实现了push
,pop
,front
和empty
函数的类模版可以看作一种容器
使用函数模版时,不需要显式指定实参
而实用类模版时,需要显式指定实参
类型形参与非类型形参
可以从模板形参表中看出来
1. 模版形参作用域
遵循名字屏蔽规则, 作用域为模版形参之后直到模版声明or定义完成
2. 类似于函数形参,模版形参的类型在同一个函数模版中不可重用。
3. 模版声明和定义可分开,模版形参表的名字不必完全相同,但是要对应
在模版内部指定类型
可以通过在成员名前面加上typename
前缀,告诉编译器将成员当做类型