C++学习_模板和泛型

C++高级 模板和泛型

函数模板

  1. 函数模板的概念
  • 函数模板是用于生成函数的模板。在编译阶段,编译器会根据函数模板的使用情况创建出函数名相同、参数类型由编译器判断的若干函数。
  • 通过函数模板创建的函数拥有相同的函数体,只是函数的参数类型不同。
  1. 函数模板的使用
  • 每当在一个编译单元中使用了函数模板,则必须在该编译单元中给出函数模板的定义。因此建议在头文件中对函数模板进行声明定义。
    函数模板的声明:
template<typename T>
返回类型 函数名(参数列表);

其中T表示任意类型,参数的类型和返回类型都可以指定为T
函数模板的定义:

template<typename T,...>
返回类型 函数名(参数列表)
{
	//函数体
}
  1. 函数模板的特化
  • 特化是指在实例化函数模板时,对特定类型的实参进行特殊的处理,即当实参为特定类型时,通过函数模板生成的函数会有不同的函数体。
  • 特化时需要为函数模板添加新的定义,方式如下:
template<>
返回类型 函数名<特定的参数类型>(参数列表){}
  1. 案例:
//声明
template<typename T>
bool isEqual(T i, T j);

//定义
template<typename T>
bool isEqual(T i, T j)
{
	return i == j;
}

//特化:
template<>
bool isEqual<char*>(char* s1, char* s2)
{
	return strcmp(s1,s2)==0;
}

类模板

  1. 类模板概念
  • 是用于生成类的模板。编译阶段编译器会根据类模板的使用情况创建出 仅部分成员数据类型、部分成员函数的参数类型不同,其他完全相同的若干个类。
  • 通过类模板的这些特性我们可以尝试写出用于存放不同类型数据的容器。
  • 比如在一个数组,在不同类中需要存放不同类型的数据
  1. 类模板使用
  • 类模板声明:
template<typename T,...>
class 类名
{//成员};

类模板成员函数定义:

template<typename T,...>
返回类型 类名<T,...>::成员函数名(形参列表)
{//函数体}

  1. 类模板的特化与偏特化
    1)特化:
  • 是指在实例化类模板时,对特定类型的泛型进行特殊的处理,即用户指定所有特定类型的类模板时,通过特化过类模板生成的类可能与其他类有完全不同的结构。
  • 特化类模板是需要对整个类模板进行声明定义:
template<>
class 类名<指定类型,指定类型,...>{//类成员};

2)偏特化:

  • 与特化类似,只是特化会指定所有的泛型,而偏特化只指定部分泛型。
  • 偏特化类模板是需要对整个类模板进行声明定义:
template<typename T,...不需要特化的泛型...>
class 类名<指定类型,...,不需要特化的泛型名,...>{//类成员};

例子:
template <typename T1, typename T2>
class Pair{
	T1 first;
	T2 second;
};

template<typename T2> //不对T2泛型进行特化
class Pair<char,T2> //只关心如果第一个类型为char则以此为模板
{}

int main{
	Pair<int,char> pair1;
	Pair<char,int> pair2;
	return 0;
}
  1. 案例:
template <typename T>
class Myarray
{
	private:
		T data[20];
		int len;
	public:
		Myarray();
		T indexof(int index);
		void addValue(T value);
};

template <typename T>
Myarray<T>::Myarray() :len(0) {}

template <typename T>
T Myarray<T>::indexof(int index)
{
	return data[index];
}

template <typename T>
void Myarray<T>::addValue(T value)
{
	data[len]=value;
	len++;
}

//特化
template<>
class Myarray<float>
{
	public:
		Myarray();
}

Myarray<float>::Myarray()
{cout<<"Myarray<float>"<<endl;}


int main()
{
	Myarray<int> arr;
	for(int i=0;i<10;i++){arr.addValue(i);}
	for(int i=0;i<10;i++){cout<<arr.indexof(i)<<endl;}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值