C++ Templates读书笔记 Tricky Basics

   C++ Templates读书笔记< 二 > Tricky Basics

* 关键字typename,用来说明某个标志符是个型别.

eg: 
1          template  <  typename T  >
2           class  MyClass
3          {
4              typename T::SubType *  ptr;
5              
6          };
* assignment运算的template版本并不会取代default assignment运算

* 双重模板参数: Template Template Parameters
eg:
 1          template  <  typename T, 
 2                  template  <  typename ELEM
 3                             typename ALLOC  =  std::alloctator < ELEM >   >  
 4                   class  CONT  =  std::deque
 5                   >
 6           class  Stack
 7          {
 8              COUT < T >  elems;         //  以第一个参数的型别完成了实例化,  也可以利用class template内的任何型别 来实例化
10          };
11       //  注:template template arguments必须完全匹配对应的参数。预设的template arguments会被编译器忽略。
12      // 所以,如果上面没有写 typename ALLOC  =  std::alloctator < ELEM >  就会报错
function templates 不允许拥有template template parameters
* 初始化
eg:
 1          template  <  typename T  >
 2           class  MyClass
 3          {
 4           private :
 5              T x;
 6           public :
 7              MyClass()
 8                  : x()     //  即使T为build-in type,x也可以被初始化
 9              {
10              }
11          };

* 只有by value传参时,才会发生 array to pointer 的转换

eg:

 1  template  <  typename T  >
 2          inline T  const &  max( T  const &  a, T  const &  b )
 3          {
 4               return  a  <  b  ?  b : a;
 5          }
 6          
 7          max(  " apple " " peach "  );     //  ok
 8          max(  " apple " " tomato "  );     //  error, 型别不同,一个是char const[6],一个是char const[7]
 9          
10          template  <  typename T  >
11          inline T max( T a, T b )
12          {
13               return  a  <  b  ?  b : a;
14          }
15          
16          max(  " apple " " peach "  );     //  ok
17          max(  " apple " " tomato "  );     //  ok, 发生了array to pointer的转换, 但比较结果是错的,因为实际上比较的是指针地址


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

小祥的BLOG http://xfxsworld.cnblogs.com 

 

你可能感兴趣的:(template)