有许多函数的功能相似,只是变量的类型不同,在语言中,处理这种问题,我们往往只能用void*来处理,但常常又会在数据转换时发生问题.在c++中函数模板就很好的替我们解决了这个问题.
template< typename T> 模板<未知变量类型 T>
#include <iostream>
#include <typeinfo>
#include <cstring>
using namespace std;
class A{};
/*
template<typename T>
void func(T t1){
cout << "class" << endl;
}
*/
template<class T> //在模板定义时 class和typename的作用相同. typedef typename T::LengthType LengthType;
// 这时,typename不能换成class,因为这是告诉编译器这是在声明一个变量
void func(T t1){
cout << "class_1" << endl;
}
template<typename T>
void func(void){
T t;
cout << "class_2" << endl;
}
template<typename T>
void swap1(T &t,T &t1){
T mid = t;
t = t1;
t1 = mid;
}
/*
template<>// 这段代码有问题,没有油大佬能帮忙看看
void swap1<char*>(char * t,char * t1){
char *p = new char[20];
strcpy(p,t);
strcpy(t,t1);
strcpy(t1,p);
delete[] p;
}
*/
int main(){
func(5);
func<A>(); //<>中只能传递类型,不能传递实例化的变量或者对象,即并不能传递<A()>
cout << "---------------" << endl;
int a = 4;
int b = 6;
swap1(a,b);
cout << a << ":" << b << endl;
cout<< "-----------------------" << endl;
char a1 = 'a';
char b1 = 'b';
swap1(a1,b1);
cout << a1 << ":" << b1 << endl;
cout << "------------------------" << endl;
string a2("asd");
string b2("ASD");
swap1(a2,b2);
cout << a2 << ":" << b2 << endl;
cout << "-----------------" << endl;
char a3[20] ="dafa";
char b3[20] ="ADA";
swap1(a3,b3);
cout << a3 << ":" << b3 << endl;
return 0;
}