模板特例化、重载

版权声明:本文为博主原创文章,欢迎分享!吾生有涯而知也无涯,一起加油 https://blog.csdn.net/qq_41822235/article/details/82424769

名词解释 静多态 

图  1多态提要

静多态(Static Polymorphism)是多态性的一种,绑定发生在编译期(compile-time)(称为静态绑定static-binding)。

图  2静多态提要

非参数化多态和参数化多态并不冲突,而且相辅相成,它们混合使用能够带来更大的灵活性,函数模板重载就是很好的例子。

#include<iostream>
#include<stdio.h>
using namespace std;

template<typename T>	
bool compare(const T a, const T b) {
	cout << "bool compare(const T a, const T b)" <<
		typeid(a).name() << "  " << typeid(b).name()<<endl;
	return a > b;
}

template<typename T, typename E>	//重载
bool compare(const T a, const E b) {
	cout<< "bool compare(const T a, const E b)" <<
		typeid(a).name() << "  " << typeid(b).name()<<endl;
	return a > b;
}

template<>	//特例化
bool compare<char *>(char *const a, char *const b) {
	cout <<"bool compare<char *>(char *const a, char *const b)" <<
		typeid(a).name() << "  " << typeid(b).name()<<endl;
	return strcmp(a, b) > 0;
}

int main() {
	compare(16, 17.6);		//模板重载
	compare(10, 20);		//非特例化
	compare("aaa", "bbb");	//特例化
	return 0;
}
图  3示例代码运行结果

函数模板用来实例化函数,在编译期根据模板函数使用处的参数自动生成一份该函数的代码,函数的入口地址就是生成函数代码的入口地址。

对于函数重载重载,C++中不允许只有函数类型(返回值)不同的重载:

  • 参数个数不同而参数类型相同;
  • 参数个数相同而参数类型不同;
  • 参数个数和参数类型都不相同;

值得注意的是,对于char *类型,与const结合时会产生二义性,需要记住一条规律:const修饰的是左边或右边第一个完整类型

bool compare(const T a, const T b)        //一般模板

bool compare<char *>(char *const a, char *const b)    //特例化模板

是否觉得const 位置有些奇怪,最初可能会有这种貌似很正确的想法。对模板进行特例化,将所有出现T的位置都换成char *不就好了嘛?试想一下,换掉之后变成什么了?

bool compare<char *>(const char * a, const char * b)    //错误示例

对于非特例化模板,const修饰的类型是T,那么当明确T是char *时,其意义是不是指向的内容不能改变而不是指向不能改变?对,没错,就是这样,这一点很值得注意。

扫描二维码关注公众号,回复: 3126632 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_41822235/article/details/82424769
今日推荐