【C++】模板进阶:非类型参数、模板特化与分离编译
目录
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