C++中模板的使用

C++中的模板一般有函数模板和类模板。

函数模板并不会创建任何函数,只会告诉编译器如何定义。如需要int型的转换时,用int替换AnyType即可              

template <typename AnyType> //表示要建立一个名Anytype的函数模板,其中template和typename为关键字。

//其中typename可以替换为class
void Swap(AnyType &a ,Antype &b)
{
    AnyType temp;
    temp = a;
    a = b;
    b = temp;
}

 类模板:


/*作用:
使用模板的目的是让程序员写出与类型无关的代码
比如写了一个交换两个整型int的swap函数,如果要交换其他类型的如
double、char类型的swap就要重新编写一个函数。
使用模板可以让程序与类型无关。如swap模板函数,可以实现int型,也可以实现double。
模板可以用于函数和类。
模板声明和定义只能在全局,命名空间或类的范围内进行。
也就是不能在局部范围内,函数内进行,如不能在main函数中声明定义一个模板
*/
//基本的用法如下:

#include<cstring>
#include<typeinfo>
#include<iostream>
using namespace std;

//整型
class A{
private:
	int m_x;
	int m_y;
public:
	A(int x, int y) :m_x(x), m_y(y){
	}
	int compare(void){

		cout << "Type of n_x is" << typeid (m_x).name() << endl;
		cout << "Type of n_x is" << typeid (m_y).name() << endl;

		if (m_x < m_y)
			return -1;
		if (m_x>m_y)
			return -1;
		return 0;
	}
};

//双精度
class B{
private:
	double m_x;
	double m_y;
public:
	B(double x, double y) :m_x(x), m_y(y){

	}

	int compare(void){

		cout << "type of m_x is" << typeid (m_x).name() << endl;
		cout << "type of m_x is" << typeid (m_y).name() << endl;
		
		if (m_x < m_y)
			return -1;
		if (m_x>m_y)
			return -1;
		return 0;

	}
};


//字符串
class C{
private:
	string  m_x;
	string  m_y;
public:
	C(string x, string y) :m_x(x), m_y(y){

	}

	int compare(void){

		cout << "type of m_x is" << typeid (m_x).name() << endl;
		cout << "type of m_x is" << typeid (m_y).name() << endl;

		if (m_x < m_y)
			return -1;
		if (m_x > m_y)
			return -1;
		return 0;

	}
};

//类模板
template<class T> class  D
{
private:
	T m_x;
	T m_y;

public:
	D(T x, T y) :m_x(x), m_y(y){

	}
	int compare(void){
		cout << "type of m_x is" << typeid (m_x).name() << endl;
		cout << "type of m_x is" << typeid (m_y).name() << endl;

		if (m_x < m_y)
			return -1;
		if (m_x > m_y)
			return -1;
		return 0;
	}
};

//针对char*的类模板成员函数特化
template<> 
int D<char*>::compare (void) 
{
	cout << "type of m_x is" << typeid (m_x).name() << endl;
	cout << "type of m_x is" << typeid (m_y).name() << endl;

	if (strcmp(m_x, m_y)<0)
		return -1;
	if (strcmp(m_x, m_y)>0)
		return -1;
	return 0;
}

//函数模板

template<class T>
int compare(T x, T y)
{
	cout << "type of m_x is" << typeid (x).name() << endl;
	cout << "type of m_x is" << typeid (y).name() << endl;

	if (x<y)
		return -1;
	if (x>y)
		return -1;
	return 0;
}

//针对char*的函数模板特化
template<>
int compare<char *>(char* x,char* y)
{
	cout << "type of m_x is" << typeid (x).name() << endl;
	cout << "type of m_x is" << typeid (y).name() << endl;

	if (strcmp(x,y)<0)
		return -1;
	if (strcmp(x,y)>0)
		return -1;
	return 0;
}


//测试程序
int main(int argc, char* argv[]){
	//不用模板
	cout << "不用模板" << endl;
	A a(10, 20);
	cout << "A:: compare() return" << a.compare() << endl;
	B b(0.1, 0.2);
	cout << "B:: compare() return" << b.compare() << endl;
	C c("coursge", "excellent");
	cout << "C:: compare() return" << c.compare() << endl;

	cout << "_______________________________________" << endl;


	cout << "用类模板" << endl;
	D<int> d1(10, 20);
	cout << "D<int>:: compare() return " << d1.compare()<<endl;
	D<double>d2(0.1, 0.2);
	cout << "D<double>:: compare() return " << d1.compare() << endl; 
	D <string>d3("courgae", "excellent");
	cout<<"D<string>::compare() return " << d1.compare()<<endl;

	cout << "_______________________________________" << endl;

	cout << "类模板及成员函数的特化" << endl;

	char sz1[] = "courage";
	char sz2[] = "excellent";
	D<char*> d4(sz1, sz2);
	cout << "D<char*>::compare() return " << d4.compare() << endl;
	cout << "____________________________________" << endl;

	//函数模板及其特化
	cout << "compare<int>() return " << compare<int>(10, 20) << endl;
	cout << "compare<double>() return " << compare<double>(0.1, 0.2) << endl;
	cout << "compare<string>() return " << compare<string>("courage", "excellent") << endl;
	cout << "compare<char*>() return " << compare<char*>(sz1, sz2) << endl;

	cout << "________________________________" << endl;


	//函数模板的隐士推断

	cout << "compare() retrun" << compare(10, 20) << endl;
	cout << "compare() retrun" << compare(0.1, 0.2) << endl;
	cout << "compare() retrun" << compare(string("courage"),string("excellent")) << endl;

	cout << "compare() retrun" << compare(sz1,sz2) << endl;
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值