C++ template 模板

发布于:2022-12-17 ⋅ 阅读:(357) ⋅ 点赞:(0)

template: 模板 可以复用的东西

需求: int add(int ,int ) double add(double,double) add(flaot,) …等多个函数的重载
重载虽然可以实现,但是类型太多了需要写太多的方法

此时我们可以使用到模板库

template< typename T> 声明T为一个通用类型,可以等于 int、 double、flaot …自定义…
T add(T a,T b )
{
T c;
return a+b;
}

我们实现了 类型无关的代码 ------ 泛型编程:类型无关的编程

如何使用:
int a = add (4,5)
double b= add(2.5,4.8)
string c= add (“Coder”,“IT”)
过程:
编译器遇到 add,编译器获知了T的类型int
编译器会 迅速的生成一个函数
int add(int a,int b) {int c; return a+b;}

​ 并调用该函数 int a=int add(5,6) ;

​ 同理以上的函数也如此编译

如何实现自己的模板函数

​ 1.实现一个 普通的函数-有指定类型
​ 2.把需要改变类型的地方 替换为通用的类型T1 T2 T3…
​ 声明T1 T2…为通用类型
​ 注意: 当前 模板函数 是不完整的,
​ 3.使用, 在使用的时候,要制定具体的类型

定义:
template< typename T1,typename T2 >
T1 sub(T1 a,T2 b)
{
T1 c;
c=a-(T1)b;
return c;
}
使用:
int a = sub<int,double> (5,5.6);
double b = sub<double,int> (3.6, 5)

我们使用最多的还是模板类

需求: 实现一个栈
template<typename T>
class stack {
public:
  int push(T val) { arr[pos]=val;pos++; return 0;}
  T pop() { pos--; return arr[pos]; }

  stack() {  pos=0;   }
private:
  T arr[8];
  int pos;
};
 
使用:
stack<string>  obj;    //编译器遇到 stack<string> ,迅速的生成一个类 ,T被替换为具体类型
obj.push("zhou"); obj.push("wu"); obj.push("zheng");obj.push("wang");
cout<<obj.pop() << obj.pop()<<endl;;

例1: 实现一个 维护数组类, 可以装载任意类型的数据

#include<iostream>
using namespace std;

template<typename T>
class stack {
public:
	int push(T val) { arr[pos]=val;pos++; return 0;}
	T pop() { pos--; return arr[pos]; }

	stack() {  pos=0;   }
private:
	T arr[8];
	int pos;
};



int main()
{ 
	stack<string>  obj; 
   //编译器遇到 stack<string> ,迅速的生成一个类 ,T被替换为具体类型
	
   obj.push("red"); obj.push("blue");
   obj.push("yellow");obj.push("green");
	cout<<obj.pop() << endl ;
	cout<<obj.pop() << endl; 
	cout<<obj.pop() << endl; 
		
}

例2:重载[],实现 a=obj[1]; a=obj.[] (1) --> int operator[] (int pos)

#include<iostream>
using namespace std;

template <typename T>
class arr{
public:
	void set_val(int pos,T val){ arr[pos]=val; }		//arr[i]=8 
	T  get_val(int pos){ return arr[pos];}				// val=arr[i];

	int get_cnt() { return 8;}
	
	int  &operator[] (int pos) 
	{
		return arr[pos];
	}
	
private:
	T arr[8];
};


int main()
{
	arr<int>  obj;
	obj.set_val(0,5);
	obj.set_val(1,8);
	obj.set_val(2,10);

	cout<<obj.get_val(0)<<" "<<obj.get_val(1)<<" "<<obj.get_val(2)<<endl;
	/*
	高级要求:
			重载[],实现    a=obj[1];    a=obj.operator[]  (1)   --> int  operator[] (int pos)

											  当前是整数,非法				
							obj[1] = 55;  --> obj.[](1) 	= 5;	--> 
	*/
	cout<<obj[0]<<" "<<obj[1]<<" "<<obj[2]<<endl;
	obj[0]=44;  obj[1]=55;  obj[2]=66; 
	cout<<obj[0]<<" "<<obj[1]<<" "<<obj[2]<<endl;
	return 0;
}

网站公告

今日签到

点亮在社区的每一天
去签到