C++里面模板函数怎么重载一个非模板函数,是根据返回值判断函数的重载调用的么?
1条回答 默认 最新
- chen_daisy 2017-07-06 01:36关注
//函数模板
template
T MyPlus(T a, T b){
T ret = a + b;
return ret;
}//普通函数
int MyPlus(int a, int b){
int ret = a + b;
return ret;
}void test03(){
int a = 10;
int b = 20;
char c = 'a';
char d = 'b';
//如果函数模板和普通函数都能匹配,c++编译器优先考虑普通函数
cout << MyPlus(a, b) << endl;
//如果我必须要调用函数模板,那么怎么办?
cout << MyPlus<>(a, b) << endl;
//此时普通函数也可以匹配,因为普通函数可以自动类型转换
//但是此时函数模板能够有更好的匹配
//如果函数模板可以产生一个更好的匹配,那么选择模板
cout << MyPlus(c,d);
}//函数模板重载
template
T MyPlus(T a, T b, T c){
T ret = a + b + c;
return ret;
}void test04(){
int a = 10; int b = 20; int c = 30; cout << MyPlus(a, b, c) << endl; //如果函数模板和普通函数都能匹配,c++编译器优先考虑普通函数
}
那么优先级和匹配怎么发生的?为什么函数模板可以和普通函数放在一起?c++编译器是如何实现函数模板机制的?
#include
using namespace std;template
T MyPlus(T a,T b){
T ret = a + b;
return ret;
}int main(){
int a = 10; int b = 20; MyPlus(a,b); char c = 'a'; char d = 'b'; MyPlus(c,d); return 0;
}
通过上面的例子我们可以发现几点:
编译器并不是把函数模板处理成能够处理任何类型的函数
函数模板通过具体类型产生不同的函数
编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编译。
编译器根据函数的调用情况,产生具体函数,这个具体函数根据类型产生。关于函数的重载机制,是一个比较复杂的问题,其中涉及到了优先级定义和最佳匹配等问题,以下链接时几个大神的回答。
http://www.cnblogs.com/liyuan989/p/4138378.html解决 无用评论 打赏 举报
悬赏问题
- ¥100 c语言,请帮蒟蒻看一个题
- ¥15 名为“Product”的列已属于此 DataTable
- ¥15 安卓adb backup备份应用数据失败
- ¥15 eclipse运行项目时遇到的问题
- ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
- ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
- ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
- ¥50 成都蓉城足球俱乐部小程序抢票
- ¥15 yolov7训练自己的数据集
- ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)