模板的进阶

模板的进阶,第1张

目录
  • 非类型模板参数
    • 模板特化
  • 模板分离编译

非类型模板参数

以前我们想要建立一个存贮一百个数据的静态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;
     }

会导致链接错误


有两种解决方法

  1. 显示实例化
//不处理,没有实例化,也没办法编译生成汇编代码
template<class T>
void F2(const T& n)
{
	cout << "void F2(const T& n)" << endl;
}

//1.显示实例化
//用一个显示实例化一个,非常麻烦
template
void F2<int>(const int& n);
  1. 声明和定义不分离
template<class T>
void F2(const T& n)
{
	cout << "void F2(const T& n)" << endl;
}

那么使用它的地方,头文件展开以后,直接就有模板定义和实例化,那就可以直接填上调用地址,不需要链接去找

【优点】

  1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生
  2. 增强了代码的灵活性

【缺陷】
4. 模板会导致代码膨胀问题,也会导致编译时间变长
5. 出现模板编译错误时,错误信息非常凌乱,不易定位错误

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/662688.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-18
下一篇 2022-04-18

发表评论

登录后才能评论

评论列表(0条)

保存