C++ templates之“模板的模板引數”
阿新 • • 發佈:2018-12-20
定義:指一個模板,它本身的引數型別就是模板,在英語原文中是“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.要了解過載解析的相關內容,尤其是二義性和演繹部分。