类模板

本文详细介绍了模板类的使用,以Stack为例展示了如何实例化和使用成员函数。同时探讨了类模板的特化,包括全特化和局部特化,以及如何通过局部特化来改变模板的行为。此外,还讨论了类模板的缺省模板参数,允许为模板参数提供默认类型。这些特性增强了模板的灵活性和适用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类模板Stack例子

///Stack<T>声明、定义

template <typename T>
class Stack
{
private:
	vector<T> elems;
	
public:
	void push(T const &);
	void pop();
	T top() const;
};

template <typename T>
void Stack<T>::push(T const &elem)
{
	...
}

template <typename T>
void Stack<T>::pop()
{
	...
}

template <typenane T>
void Stack<T>::top() const
{
	...
}

///Stack<T>使用``

Stack<int> intStack;
intStack.push(7);

成员函数在使用时才会被实例化。对于上面模板类Stack,只有push函数具有实体,因为push函数已经被调用。这种特性带来的一个好处是,即使int不支持Stack模板中成员函数poptop中的操作,也可以使用Stack模板。

但是对于类模板中的静态成员函数,所有用来实例化的类型,都会实例化静态成员函数,而不会等到调用时才实例化。

类模板特化

用string特化Stack<T>的例子//

class Stack<string>
{
private:
	deque<string> elems;

public:
	void push(string const&);
	void pop();
	string top() const;
};

void Stack<string>::push(string const& elem)
{
	...
}

void Stack<string>::pop()
{
	...
}

string Stack<string>::top() const
{
	...
}

特化类的实现和基本类模板的实现可以完全不同。Stack基本类模板是用vector管理内部元素的,而特化类Stack用deque

局部特化

template <typename T1, typename T2>
class MyClass
{
	...
};

// 第一种局部特化:模板参数具有相同类型
template <typename T>
class MyClass<T, T>
{
	...
};

// 第二种局部特化:部分模板参数为具体类型
template <typename T>
class MyClass<T, int>
{
	...
};

// 第三种局部特化:模板参数为指针类型
template <typename T1, typename T2>
class MyClass<T1*, T2*>
{
	...
};

编译器会选择匹配程度最好的模板,当多个模板同等匹配时就是声明具有二义性。

// 具有二义性的模板类对象声明 (同等匹配MyClass<T, T>和MyClass<T, int>)
MyClass<int, int> m;

缺省模板参数

类模板允许为模板参数定义缺省值,被称为缺省模板实参。缺省模板实参还可以引用前面的模板参数。

template <typename T, typename CONT = vector<T>>
class Stack
{
private:
	CONT elemes;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值