1. 程式人生 > >C++ templates之“模板的模板引數”

C++ templates之“模板的模板引數”

定義:指一個模板,它本身的引數型別就是模板,在英語原文中是“template template parameter”。

例如:template<typename T1,   template<typename T2> class CONT>,就是將template引數型別宣告中的一個(原本應該是typename T2)替換成template<typename T2> class CONT

關鍵點:

1. 在模板的模板引數中,class(指上面例子中標紅色的class) 不能被替換成typename。在模板中,如果不能區分的哪應該使用typename和class,可以全部都用class替代,typename和class的作用基本相同,而typename出現得比較晚。同時它也支援預設值。

  • 例:template<typename T1,   template<typename T2> class CONT>  class A{.........}            // 正確
  •        template<typename T1,   template<typename T2> typename CONT>  class A{.........}            // 錯誤
  •        template<typename T1,   template<class T2> class CONT>  class A{.........}            // 正確
  •        template<typename T1,   template<typename T2> typename CONT=std::list>  class A{.........}   //正確

2.以上面的例子為例,在使用第二個引數,必須是一個模板類。

3.函式模板不支援模板的模板引數。

  • 例:template<template<typename T> class CONT>  void func{.........}          //錯誤

4.在模板中,可以前面的模板引數宣告可以被後面的使用。

  • 例:template<typename T1, 
  •                         template<typename T2, typename ALLOC=std::allocator<T2> > class CONT=std::list
  • class A{.........}          //假設T1和T2的型別一樣,那T2可以用T1替代(當然型別不一樣也可以,只要容器空間分配不                                                     出問題)。同時,如果T2沒用的話可以省略不寫。

5.函式定義

  • 例:template<typename T1,   template<typename T2> typename CONT=std::list
  • class A{     void func();  .........}
  • template<typename T1,   template<typename T2> typename CONT=std::list
  • void A<T1,/*list*/>::func(){.....}     //如果使用編譯器(Qt)自動生成定義的話,會報錯,因為沒有此行中紅色標註的

6.要了解過載解析的相關內容,尤其是二義性和演繹部分。