C++学习_模板和泛型

Posted Leslie X徐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于C++学习_模板和泛型的主要内容,如果未能解决你的问题,请参考以下文章

模板和泛型编程C++

模板和泛型编程C++

模板和泛型编程C++

C++ Primer 5th笔记(chap 16 模板和泛型编程)类型无关和模板编译

C++ Primer 5th笔记(chap 16 模板和泛型编程)成员模板

C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板