编程语言
首页 > 编程语言> > c++另一种编程思想称为泛型编程

c++另一种编程思想称为泛型编程

作者:互联网

c++提供两种模板机制:函数模板和类模板

函数模板

建立一个通用函数,函数的返回值类型和形参类型可以不具体指定,用一个虚拟的类型来代表

语法:


cpp
template<typename T> 
//或者
template<class T>
函数声明或定义

当使用class的时候,如果T有子类,编译器会认为是声明,所以还是使用typename吧

cpp
template<typename T>

void test(T& a, T& b) {
	T temp = a;
	a = b;
	b = temp;
}

int main() {

	int a = 1, b = 2;
	//自动推导类型
	test(a, b);
	//指定类型
	test<int>(a, b);
	cout << a << "==" << b << endl;
}       

注意事项:

自动类型推导,必须推导出一致的数据类型T才可以使用

模板必须要确定出T的数据类型,才可以使用

cpp
template<typename T>

void test(T& a, T& b) {
	T temp = a;
	a = b;
	b = temp;
}

int main() {

	int a = 1, b = 2;
	char c='1';
	//自动推导类型错误,因为两个类型不同
	test(a, c);
}    

cpp
template<typename T>

void test() {
	cout << "hhhh" << endl;
	
}
int main() {
	test();//错误,因为推导不出T是什么类型
}                                  
cpp
template<typename T>
void test() {
	cout << "hhhh" << endl;
	
}

int main() {
	test<int>(); //明确指定就可以
    test<string>();//这个也可以
}                                  

普通模板和函数模板区别

普通函数会发生隐式转换,例如下面的例子中,将char类型的c转换为了int,对应的就是c的ascll

cpp
void print1(int a, int b) {
	cout << a + b << endl;
}

int main() {
	int a = 1;
	char b = 'c';
	print1(a,b);
}   

而使用模板函数时

cpp
template<typename T>

void print(T a,T b) {
	cout << a+b << endl;
}

int main() {
	int a = 1;
	char b = 'c';
	print(a,b);  //报错
}   

cpp
template<typename T>

void print(T a,T b) {
	cout << a+b << endl;
}

int main() {
	int a = 1;
	char b = 'c';
	print<int>(a,b);  //除非我们指定了数据类型为int
}     

普通函数和模板函数的调用规则

如果函数模板和普通函数都可以实现,优先调普通函

cpp
template<typename T>

void test(T a) {
	cout <<"函数模板" << endl;
}
void test(int a) {
	cout << "普通函数" << endl;
}

int main() {
	int a = 1;
	test(a);
}                                  

结果:普通函数

cpp
template<typename T>

void test(T a) {
	cout <<"函数模板" << endl;
}
void test(int a);

int main() {
	int a = 1;
	test(a);
}    

如果普通函数只有声明也是调用普通函数,会报错没有找到定义

标签:c++,输入,文件,方法,编程,设置,代码,安装,链接,下载,压缩
来源: