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 }
注:返回类型不能是引用。因为若返回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.042.0 );       // 调用max<double>
13         max( 'a''b' );         // 调用max<char>
14         max( 742 );            // 调用int重载的非函数模板
15         max<>742 );        // 调用max<int>            上述 a>
16         max<double>742 ); // 调用max<double>    没有实参演绎
17         max< 'a'42.7 >;      // 调用int重载的非函数模板    上述 b>
c> 函数的所有重载版本的声明都应该位于函数被调用的位置之前

版权声明:本篇为原创文章,允许转载,但转载时请务必以超链接形式标明文章的原始出处和作者信息。请尊重本人的劳动成果,谢谢!
小祥的BLOG http://xfxsworld.cnblogs.com