模板类,具体化

普通模板类

在申明模板类的开头应该使用:template<typename Type>,关键字template告诉编译器将要定义一个模板,Type是一个通用类型说明符,在使用模板时,将使用实际类型代替它,如(string或Int)。模板类的成员函数申明应该为:template<typename Type> bool Stack<Type>::push(),和普通函数不同之处便为函数限定符从Stack::改为Stack<Type>::。值得注意的是,模板类的函数应该和模板类的申明放在一块,以下给出简单的实例代码:

/*这段代码使用指针类模板**/
template <typename Type>
class Stack2
{
public:
	/*动态赋值**/
	explicit Stack2(int ss) :ss(stackSize), top(0) { Items = new Type[stackSize]; } // 通过给定explicit 来阻止隐式转换
	Stack2(const Stack2& st); // 复制构造函数
	~Stack2() { delete[] Items; }
	Stack2& operator=(const Stack2& st); // 赋值
	bool push(const Type& st);
	bool pop(Type& st);
private:
	enum{Size = 10}; // 默认长度
	int stackSize;   // 实际长度
	int top;         
	Type* Items;
	/*私有接口判断空或者满**/
	bool isEmpty() { return top == 0; }
	bool isFull() { return top == stackSize; }
};
/*模板类的函数需要这样申明**/
template<typename Type>
Stack2<Type>::Stack2(const Stack2& st)
{
	/*赋值语句**/
	this->stackSize = st.stackSize;
	this->top = st.top;
	/*动态内存赋值**/
	Items = new Type[stackSize];
	// 通过循环来给值
	for (int i = 0;i < stackSize;i++ )
	{
		Items[i] = st.Items[i];
	}
}
// 除了构造函数都需要申明返回类型
template <typename Type>
const Stack2<Type>&  Stack2<Type>::operator=(const Stack2& st)
{
	if (this == &st)
		return *this;
	delete[] Items; // 先清空空间
	/*赋值语句**/
	this->stackSize = st.stackSize;
	this->top = st.top;
	/*动态内存赋值**/
	Items = new Type[stackSize];
	// 通过循环来给值
	for (int i = 0; i < stackSize; i++)
	{
		Items[i] = st.Items[i];
	}
}
template <typename Type>
bool Stack2<Type>::push(const Type& item)
{
	if (isFull() == true) // 若满了,则不添加
		return false;
	else // 若没有满,则添加
	{
		Items[++top] = item;
		return true;
	}
}
template <typename Type>
bool Stack2<Type>::pop(Type& item)
{
	if (isEmpty() == true)
		return false; 
	else
	{
		item = Items[top--]; // 先把需要弹出的记录下来,然后剪掉它进行弹出
		return true;
	}
}

模板参数:

模板常用作容器,接着我们介绍一下,允许指定大小的数组模板。第一种方法就如上述代码一样,申明一个动态数组,在构造函数中为其空间进行赋值。另一种方法就是使用模板参数来提供常规数组大小。如:ArraTP<double,12> donuts; 。表达式参数有一些限制,它可以是整数、枚举、指针或引用。另外模板不能修改,也不能使用参数的地址。

部分具体化和显式具体化的区别:

记住隐私实例化和显式实例化都是类申明,申明之后在进行实例化,其实都是根据通用模板来的。而显式具体化是模板类的定义,即重新定义一个,我们所需的模板类,比如需要使参数为const char* 的模板类和参数为int的模板类所产生结果不一样的话,我们便可用到显式具体化。

现在我们来看看部分具体化:

template<class T1,class T2> class pair {......} 

templae<class T1> class<T1,int> pair {......}

部分具体化即,即部分限制模板的通用性,关键字template后面的<>声明的是没有被具体化的类型参数。因此,上述第二个声明将T2具体化为int。注意,如果指定所有类型,则<>将为空,这将导致显示具体化。部分具体化除上面所述外,还有一种形式,如下图所示,指定参量为指针的时候,也可以采用部分具体化的方式。侯老师称这两种偏特化为个数上的偏和范围上的偏。

显示具体化的实例,我们来看看STL内部对哈希表进行的显示具体化:

 其中_STL_TEMPLATE_NULL就是由template<>通过typdef所得到的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值