- 非类型模板参数
- 模板特化
- 模板分离编译
以前我们想要建立一个存贮一百个数据的静态stack,可以用#define
,但这时候又想开一个新的存储两百个数据的栈就会出问题
#define N 100
template<class T>
class MyStack
{
public:
void push(const T& x)
{}
private:
T _a[N];
size_t _top;
};
非类型模板参数 – 只允许是整型常量(int,short,char,long,longlong
)
template<class T,size_t N>
class MyStack
{
public:
void push(const T& x)
{}
private:
T _a[N];
size_t _top;
};
int main()
{
MyStack<int,100> st1;
MyStack<int,200> st2;
return 0;
}
模板特化
template<class T1, class T2>
class Data
{
public:
Data() { cout << "Data" << endl; }
private:
T1 _d1;
T2 _d2;
};
//全特化
template<>
class Data<int, char>
{
public:
Data() { cout << "Data" << endl; }
private:
int _d1;
char _d2;
};
//偏特化
template<class T1>//第二个模板参数是一个指定值
class Data<T1, char>
{
public:
Data() { cout << "Data" << endl; }
private:
int _d1;
char _d2;
};
模板分离编译
声明和定义分离的优势是方便维护,看xxx.h了解基本功能,看xxx.cpp了解具体实现细节
//在头文件中声明
template<class T>
void F2(const T& n);
//在cpp中定义
//不处理,没有实例化,也没办法编译生成汇编代码
template<class T>
void F2(const T& n)
{
cout << "void F2(const T& n)" << endl;
}
会导致链接错误
有两种解决方法
- 显示实例化
//不处理,没有实例化,也没办法编译生成汇编代码
template<class T>
void F2(const T& n)
{
cout << "void F2(const T& n)" << endl;
}
//1.显示实例化
//用一个显示实例化一个,非常麻烦
template
void F2<int>(const int& n);
- 声明和定义不分离
template<class T>
void F2(const T& n)
{
cout << "void F2(const T& n)" << endl;
}
那么使用它的地方,头文件展开以后,直接就有模板定义和实例化,那就可以直接填上调用地址,不需要链接去找
【优点】
- 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生
- 增强了代码的灵活性
【缺陷】
4. 模板会导致代码膨胀问题,也会导致编译时间变长
5. 出现模板编译错误时,错误信息非常凌乱,不易定位错误
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)