C++_模板函数重载

C++_模板函数重载

1、先列出候选函数,包括普通函数、参数推到成功的模板函数
2、根据“类型转换”来排序
3、选择更匹配的函数
4、匹配度相同时,优先选择普通函数
5、对于多个模板函数选择更特化的
①列出推导函数:
第一个模板函数:mymax(const int& a, const int& b);
第二个模板函数:mymax(int& a, int& b);
第三个模板函数:mymax(int& a, int& b);
②确定咱们调用的参数
mymax(int, int);
③根据参数排序
第一个模板函数:int转换成const int
第二个模板函数:int装换成int
第三个模板函数:int装换成int

#include <iostream>
#include <string.h>
#include <unistd.h>

using namespace std;

template<typename T>
const T& mymax(const T& a, const T& b)  //排在第二位
{
	cout<<"1: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

template<typename T>
const T& mymax(T& a, T& b)  //并列第一位
{
	cout<<"2: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

const int& mymax(int& a, int& b)  //并列第一位,因为优先选择普通函数,所以不会有二义性
{
	cout<<"3: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

int main(int argc, char **argv)
{
	int ia = 1;
	int ib = 2;

	cout<<mymax(ia, ib)<<endl;

	return 0;
}

2、复现二义性出现

#include <iostream>
#include <string.h>
#include <unistd.h>

using namespace std;

template<typename T>
const T& mymax(const T& a, const T& b)  //排在第二位
{
	cout<<"1: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

template<typename T>
const T& mymax(T& a, T& b)  //并列第一位
{
	cout<<"2: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

const int& mymax(int& a, int& b)  //并列第一位,因为优先选择普通函数,所以不会有二义性
{
	cout<<"3: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

template<typename T>
const T mymax(T a, T b)  //并列第一位
{
	cout<<"4: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

int main(int argc, char **argv)
{
	int ia = 1;
	int ib = 2;

	cout<<mymax(ia, ib)<<endl;

	return 0;
}
#include <iostream>
#include <string.h>
#include <unistd.h>

using namespace std;

template<typename T>
const T& mymax(const T& a, const T& b)
{
	cout<<"1: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

template<typename T>
const T& mymax(T& a, T& b)
{
	cout<<"2: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

#if 0
const int& mymax(int& a, int& b)   //普通函数注释掉后剩下两个并列第一位的模板函数就会因为二义性而报错
	cout<<"3: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}
#endif

template<typename T>
const T mymax(T a, T b)
{
	cout<<"4: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}


int main(int argc, char **argv)
{
	int ia = 1;
	int ib = 2;

	cout<<mymax(ia, ib)<<endl;

	return 0;
}

3、传入指针变量
①列出推导函数:
第一个模板函数:mymax(const int*, const int*);
第二个模板函数:mymax(int*, int*);
第三个模板函数:不匹配
②根据参数排序:
第一个模板函数:int *转换成const int *
第二个模板函数:int *装换成int *

#include <iostream>
#include <string.h>
#include <unistd.h>

using namespace std;

template<typename T>
const T& mymax(const T& a, const T& b)  //第二位
{
	cout<<"1: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

template<typename T>
const T& mymax(T& a, T& b)  //第一位
{
	cout<<"2: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

const int& mymax(int& a, int& b)
{
	cout<<"3: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

int main(int argc, char **argv)
{
	int ia = 1;
	int ib = 2;

	cout<<mymax(ia, ib)<<endl;

	int *p1=&ia;
	int *p2=&ib;

	cout<<mymax(p1, p2)<<endl;

	return 0;
}

4、改进例程3
①列出推导函数:
第一个模板函数:mymax(const int*, const int*);
第二个模板函数:mymax(int*, int*);
第三个模板函数:不匹配
第四个模板函数:mymax(int*, int*);
②根据参数排序:
第一个模板函数:int 转换成const int *
第二个模板函数:int 装换成int *
第四个模板函数:int 装换成int *
③找出最特化,对比第二个模板函数和第四个模板函数
第二个模板函数可以推导出:mymax(int
, int
);和mymax(int, int);
第四个模板函数只能推导出:mymax(int
, int*);更加具体化,所以选择第四个模板

#include <iostream>
#include <string.h>
#include <unistd.h>

using namespace std;

template<typename T>
const T& mymax(const T& a, const T& b)
{
	cout<<"1: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

template<typename T>
const T& mymax(T& a, T& b)
{
	cout<<"2: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

template<typename T>
const T mymax(T * a, T* b)
{
	cout<<"4: "<<__PRETTY_FUNCTION__<<endl;
	return (*a < *b)? *b : *a;
}

const int& mymax(int& a, int& b)
{
	cout<<"3: "<<__PRETTY_FUNCTION__<<endl;
	return (a < b)? b : a;
}

int main(int argc, char **argv)
{
	int ia = 1;
	int ib = 2;

	cout<<mymax(ia, ib)<<endl;

	int *p1=&ia;
	int *p2=&ib;

	cout<<mymax(p1, p2)<<endl;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值