当前位置: 首页 > news >正文

函数模板的具体化

函数模板优点是通用性,可以解决某个方面的普遍性问题,但是这个世界上的事情不是绝对的,有普遍的,就有绝对的。举个栗子:

#include <iostream>
using namespace std;
template <typename T>
void Swap(T &a,T &b) {T temp = a;a = b;b = temp;return ;
}
class CGirl {public:int m_bk;//编号string m_name;	      //姓名int m_rank;	      //排名
};int main() {return 0;
}

我要是只想用这个Swap函数交换超女类的排名,不交换其他成员,这样的话swap函数模板中现有的代码就不合适了;

——————————————————————————————————————————

为了满足特殊的需求,可以提供一个具体化的函数,当编译器找到与函数调用匹配的具体化定义时,将使用该定义,不再寻找模板。————函数模板的具体化!!

语法:

template <> void 函数模板名 (参数列表)

//函数体;

}

#include <iostream>
using namespace std;class CGirl {public:int m_bk;//编号string m_name;	      //姓名int m_rank;	      //排名
};
template <typename T>
void Swap(T &a,T &b) {T temp = a;a = b;b = temp;return ;
}
//具体化函数:
template <> void Swap<CGirl>(CGirl& g1, CGirl& g2)
//template <> void Swap(CGirl& g1, CGirl& g2) 这两种方法是一样的;
{int temp = g1.m_rank;g1.m_rank = g2.m_rank;g2.m_rank = temp;cout << "带哦用的Swap(CGirl &g1,CGirl &g2)\n";return ;
}int main() {int a = 10, b = 20;Swap(a, b);cout << "a = " << a << ", b = " << b << endl;CGirl g1, g2;g1.m_rank = 1;g2.m_rank = 2;Swap(g1, g2);cout << "g1.m_rank = " << g1.m_rank << " , g2.m_rank = " << g2.m_rank << endl;return 0;
}

对于给定的函数名,可以有普通函数,函数模板和具体化的函数模板,以及他们的重载版本;

编译器用用各种函数的规则:

1:具体化优先于常规模板,普通函数优先于具体化和常规模板;

2:如果希望使用函数模板,可以用空模板参数强制使用函数模板;

3:如果函数模板能产生更好的匹配,将优先于普通函数。

#include <iostream>
using namespace std;void Swap(int a , int b) {cout << "使用了普通函数。\n";
}
template <typename T>
void Swap(T a,T b) {cout << "使用了函数模板。\n";
}
//具体化函数:
template <> 
void Swap(int a,int b)
{cout << "使用了具体化的函数模板。\n";
}int main() {Swap(1, 2);return 0;
}

普通函数优先于函数模板,所以编译器选择第一个,普通函数;

使用了普通函数。C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 23260)已退出,代码为 0。
按任意键关闭此窗口. . .

如果把普通函数注释掉:选择了具体化的函数模板:

#include <iostream>
using namespace std;//void Swap(int a , int b) {
//	cout << "使用了普通函数。\n";
//}
template <typename T>
void Swap(T a,T b) {cout << "使用了函数模板。\n";
}
//具体化函数:
template <> 
void Swap(int a,int b)
{cout << "使用了具体化的函数模板。\n";
}int main() {Swap(1, 2);return 0;
}
使用了具体化的函数模板。C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 13556)已退出,代码为 0。
按任意键关闭此窗口. . .

如果把具体化版本的代码注释掉,再运行,只能使用函数模板了:

#include <iostream>
using namespace std;//void Swap(int a , int b) {
//	cout << "使用了普通函数。\n";
//}
template <typename T>
void Swap(T a,T b) {cout << "使用了函数模板。\n";
}
//具体化函数:
//template <> 
//void Swap(int a,int b)
//{
//	cout << "使用了具体化的函数模板。\n";
//}int main() {Swap(1, 2);return 0;
}
使用了函数模板。C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 21920)已退出,代码为 0。
按任意键关闭此窗口. . .

----------

如果不想使用普通函数,想使用函数模板,可以加空模板参数:

#include <iostream>
using namespace std;void Swap(int a , int b) {cout << "使用了普通函数。\n";
}
template <typename T>
void Swap(T a, T b) {cout << "使用了函数模板。\n";
}
//具体化函数:
template <> 
void Swap(int a,int b)
{cout << "使用了具体化的函数模板。\n";
}int main() {Swap<>(1, 2);return 0;
}
使用了具体化的函数模板。C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 23204)已退出,代码为 0。
按任意键关闭此窗口. . .

如果把具体化版本的代码注释掉,再运行,只能使用函数模板了:

http://www.lryc.cn/news/375265.html

相关文章:

  • 【Linux 内存管理】
  • AJAX 数据库
  • 力扣719.找出第K小的数对距离
  • 富格林:掌握可信出金交易策略
  • HCS-华为云Stack-容器网络
  • 【CSS in Depth2精译】1.1 层叠
  • 【读博日记】拓扑结构(待修正)
  • QT 中setVisible()和setEnabled()的区别
  • 速度(velocity)、加速度(acceleration)、急动度(jerk)和弹跳度(snap)傻傻分不清楚?
  • 【YashanDB知识库】PHP使用ODBC使用数据库绑定参数功能异常
  • 初级篇-Docker容器知识
  • 【抽代复习笔记】19-群(十三):奇偶置换、循环置换的几个定理及例题
  • RT-Thread简介及启动流程分析
  • MCU嵌入式AI开发笔记-视频笔记同步更新
  • DoIP——step2:车辆发现
  • 【动态规划】0-1背包问题
  • WordPress 高级缓存插件 W3 Total Cache Pro 详细配置教程
  • 每日一题——Python实现PAT乙级1012 数字分类(举一反三+思想解读+逐步优化)五千字好文
  • Unity2D游戏制作入门 | 13 ( 之人物三段攻击 )
  • DAY04 HTMLCSS
  • Linux_理解程序地址空间和页表
  • NAND闪存市场彻底复苏
  • 过拟合与正则化
  • VMware挂载NAS存储异常处理
  • Redis 7.x 系列【4】命令手册
  • 走进Elasticsearch
  • QT TCP服务器和客户端示例程序
  • Xlua三方库Android编译出错解决办法
  • 美国犹他州立大学《Nature Geoscience》(IF=18)!揭示草本植物对土壤有机碳的重要贡献!
  • 高考专业抉择计算机专业热度不减,兴趣、实力与挑战并存。