C++ Templates读书笔记< 一 > 函数模版
* 并不是把模板编译成一个可以处理任何类型的单一实体,而是对于实例化模板参数的没种类型,都从模板产生出一个不同的实体。
* 具体类型代替模板参数的过程,叫做“实例化”
* 模板被编译了两次:
1。 实例化之前,检查模板本身的语法
2。 实例化期间,察看是否所有的调用都有效
* 函数模板内部,不能制定缺省的模板实参(类模板可以)。
* 函数模板的实参演绎:调用参数的类型构造自模板参数,所以模板参数和调用参数通常是相关的。
模板实参演绎并不适合返回类型。
* eg:
1 template< typename T1, typename T2 >
2 inline T1 max( T1 const& a, T2 const& b )
3 {
4 return a < b ? b : a;
5 }
2 inline T1 max( T1 const& a, T2 const& b )
3 {
4 return a < b ? b : a;
5 }
注:返回类型不能是引用。因为若返回T2类型实参,则T2需要转为T1,这个过程将会创建一个新的局部临时变量。
* 重载函数模版:
a> 一个非模板函数可以和一个同名的模版函数同时存在,并且该模板函数还可以被实例化为这个非模板函数。
b> 模板不允许自动类型转换,但普通非模板函数可以。
eg:
1 inline int const& max( int const& a, int const& b )
2 {
3 return a < b ? b : a;
4 }
5
6 template< typename T >
7 inline T const& max( T const& a, T const& b )
8 {
9 return a < b ? b : a;
10 }
11
12 max( 7.0, 42.0 ); // 调用max<double>
13 max( 'a', 'b' ); // 调用max<char>
14 max( 7, 42 ); // 调用int重载的非函数模板
15 max<>( 7, 42 ); // 调用max<int> 上述 a>
16 max<double>( 7, 42 ); // 调用max<double> 没有实参演绎
17 max< 'a', 42.7 >; // 调用int重载的非函数模板 上述 b>
2 {
3 return a < b ? b : a;
4 }
5
6 template< typename T >
7 inline T const& max( T const& a, T const& b )
8 {
9 return a < b ? b : a;
10 }
11
12 max( 7.0, 42.0 ); // 调用max<double>
13 max( 'a', 'b' ); // 调用max<char>
14 max( 7, 42 ); // 调用int重载的非函数模板
15 max<>( 7, 42 ); // 调用max<int> 上述 a>
16 max<double>( 7, 42 ); // 调用max<double> 没有实参演绎
17 max< 'a', 42.7 >; // 调用int重载的非函数模板 上述 b>
c> 函数的所有重载版本的声明都应该位于函数被调用的位置之前