博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++语言基础(19)-模板的显式具体化
阅读量:6483 次
发布时间:2019-06-23

本文共 3180 字,大约阅读时间需要 10 分钟。

应用背景:

例如有下面的函数模板,它用来获取两个变量中较大的一个:

template
const T& Max(const T& a, const T& b){ return a > b ? a : b;}

请读者注意a > b这条语句,>能够用来比较 int、float、char 等基本类型数据的大小,但是却不能用来比较结构体变量、对象以及数组的大小,因为我们并没有针对结构体、类和数组重载>

另外,该函数模板虽然可以用于指针,但比较的是地址大小,而不是指针指向的数据,所以也没有现实的意义。

让模板能够针对某种具体的类型使用不同的算法(函数体或类体不同),这在 C++ 中是可以做到的,这种技术称为模板的显示具体化(Explicit Specialization)

一.函数模板的显式具体化

#include 
#include
using namespace std;typedef struct { string name; int age; float score;} STU;template
const T& Max(const T &a, const T &b);template<>const STU& Max
(const STU &a, const STU &b);ostream & operator<<(ostream &out, const STU &stu);int main() { int a = 10; int b = 20; cout<
<
const T& Max(const T &a, const T &b) { return a > b ? a : b;}template<>const STU& Max
(const STU &a, const STU &b) { return a.score > b.score ? a : b;}ostream & operator<<(ostream &out, const STU &stu) { out<
<<", "<
<<", "<

运行结果:

20

Jack,16,95.5

语法格式为:

template<> const STU& Max(const STU& a, const STU& b);

二.类模板显式具体化

#include 
#include
using namespace std;template
class Point {public: Point(T1 x, T2 y):m_x(x), m_y(y){}public: T1 getX() const {
return m_x;} void setX(T1 x) {m_x = x;} T2 getY() const {
return m_y;} void setY(T2 y) {m_y = y;} void display() const;private: T1 m_x; T2 m_y;};// 这里要带上模板头template
void Point
::display() const { cout<<"x="<
<<", y="<
<
class Point
{public: Point(char *x, char *y):m_x(x), m_y(y){}public: char* getX() const { return m_x;} void setX(char *x) {m_x = x;} char *getY() const { return m_y;} void setY(char *y) {m_y = y;} void display() const;private: char *m_x; char *m_y;};// 注意!这里不能带模板头template<>void Point
::display() const { cout<<"x="<
<<", y="<
<
(10,20))->display(); (new Point
(20,"jack"))->display(); (new Point
("java","android"))->display(); return 0;}

运行结果:

x =10, y = 20

x = 20, y = jack

x = java, y = android

需要注意的是:在类模板的具体化中,成员方法的实例化是不能带模板头template<>的。

三.部分显式具体化

#include 
using namespace std;// 类模板template
class Point {public: Point(T1 x, T2 y):m_x(x), m_y(y){}public: T1 getX() const {
return m_x;} void setX(T1 x){m_x = x;} T2 getY() const {
return m_y;} void setY(T2 y){m_y = y;} void display() const;private: T1 m_x; T2 m_y;};template
void Point
::display() const { cout<<"x="<
<<", y="<
<
class Point
{public: Point(char *x, T2 y):m_x(x), m_y(y){}public: char *getX() const { return m_x;} void setX(char *x){m_x = x;} T2 getY() const { return m_y;} void setY(T2 y){m_y = y;} void display() const;private: char *m_x; T2 m_y;};// 部分显式具体化还是需要加上模板头template
void Point
::display() const { cout<<"x="<
<<" | y="<
<
(10,20))->display(); (new Point
("jack",10))->display(); (new Point
("java","android"))->display(); return 0;}

运行结果:

x = 10, y = 20

x = jack | y = 10

x = java | y = android

注意:

部分显式具体化只能用于类模板,不能用于函数模板

转载地址:http://priuo.baihongyu.com/

你可能感兴趣的文章
User Agent注入攻击及防御
查看>>
ASP.NET MVC 性能优化总结
查看>>
布尔表达式与条件判断-4
查看>>
[AGC012E]Camel and Oases
查看>>
bt5设置IP
查看>>
WildFly8(JBoss)默认web服务器-------Undertow
查看>>
LightOJ - 1354 IP Checking
查看>>
【实习记】2014-08-24实习生无法映射磁盘替代方案rsync+非默认端口22设置
查看>>
unisound_asr 云知声 语音识别 python版接口
查看>>
ocelot 配置文件 意思
查看>>
nodejs 环境安装
查看>>
LeetCode 139. Word Break
查看>>
学习笔记之Model selection and evaluation
查看>>
内存映射MMAP和DMA【转】
查看>>
linux内核环形缓冲区【转】
查看>>
[BZOJ2463][中山市选2009]谁能赢呢?
查看>>
(十四)struts2的国际化
查看>>
Eclipse启动时出现错误 An internal error occurred during: "Updating indexes"
查看>>
使用RateLimiter完成简单的大流量限流,抢购秒杀限流
查看>>
Mybatis框架入门
查看>>