目錄
1. 非類型模板參數
2. 模板的特化
3. 分離編譯
1. 非類型模板參數
模板參數分類類型形參與非類型形參。
類型形參即:出現在模板參數列表中,跟在class或者typename之類的參數類型名稱。
非類型形參,就是用一個常量作為類(函數)模板的一個參數,在類(函數)模板中可將該參數當成常量來使用。
/* 非類型模板參數 */
/* <類型參數, 非類型模板參數> */
template<class T, int N>
class Array
{
public:// ...
private:T _a[N];
};int main()
{Array<int, 100> a1; // 100 個 int 類型空間的靜態數組Array<int, 1000> a2; // 1000 個 int 類型空間的靜態數組return 0;
}
注意:
-
浮點數、類對象以及字符串是不允許作為非類型模板參數的。
-
非類型的模板參數必須在編譯期就能確認結果。
2. 模板的特化
template<class T1, class T2>
class Data
{
public:Data() { cout << "原模板類:Data<T1,T2>" << endl; }
private:T1 _d1;T2 _d2;
};// 全特化 全部參數都特化
template<>
class Data<int, char>
{
public:Data() { cout << "全特化:Data<int,char>" << endl; }
private:
};// 偏特化
template<class T2>
class Data<int, T2>
{
public:Data() { cout << "偏特化:Data<int,T2>" << endl; }
private:
};
// 偏特化
template<class T1, class T2>
class Data<T1*, T2*>
{
public:Data() { cout << "偏特化:Data<T1*,T2*>" << endl; }
private:
};
// 偏特化
template<class T1, class T2>
class Data<T1&, T2&>
{
public:Data() { cout << "偏特化:Data<T1&,T2&>" << endl; }
private:
};
示例使用:
void test2()
{// 可以特化很多個模板Data<int, int> d1;Data<int, double> d2;Data<int, char> d3;Data<char, char> d4;Data<char*, char*> d5;Data<char&, char&> d6;
}
3. 分離編譯
項目工程中一般將函數或者類的聲明放到.h,將函數或者類的定義放到.cpp,這么做是為了方便查看和維護。
但是,模板不能分離編譯。
同樣是分離編譯,普通函數/類可以,函數模板/類模板為什么不行?
3.3 解決方法
1. 將聲明和定義放到一個文件 "xxx.hpp" 里面或者xxx.h其實也是可以的。推薦使用這種。
2. 模板定義的位置顯式實例化。這種方法不實用,不推薦使用。
【分離編譯擴展閱讀】 http://blog.csdn.net/pongba/article/details/19130