应用背景:

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

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

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

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

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

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

#include <iostream>
#include <string> using namespace std; typedef struct {
string name;
int age;
float score;
} STU; template<typename T>
const T& Max(const T &a, const T &b); template<>
const STU& Max<STU>(const STU &a, const STU &b); ostream & operator<<(ostream &out, const STU &stu); int main() { int a = ;
int b = ;
cout<<Max(a,b)<<endl; STU stu1 = {"Jack",,95.5};
STU stu2 = {"Mike",,90.0};
cout<<Max(stu1,stu2)<<endl; return ;
} template<typename T>
const T& Max(const T &a, const T &b) {
return a > b ? a : b;
} template<>
const STU& Max<STU>(const STU &a, const STU &b) {
return a.score > b.score ? a : b;
} ostream & operator<<(ostream &out, const STU &stu) {
out<<stu.name<<", "<<stu.age<<", "<<stu.score;
return out;
}

运行结果:

Jack,16,95.5

语法格式为:

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

二.类模板显式具体化

#include <iostream>
#include <string> using namespace std; template<typename T1, typename T2>
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<typename T1, typename T2>
void Point<T1,T2>::display() const {
cout<<"x="<<m_x<<", y="<<m_y<<endl;
} // 类模板显式具体化(针对字符串类型的显式具体化)
template<>
class Point<char *, char *> {
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<char*, char*>::display() const {
cout<<"x="<<m_x<<", y="<<m_y<<endl;
} int main() { (new Point<int,int>(,))->display();
(new Point<int, char*>(,"jack"))->display();
(new Point<char*,char*>("java","android"))->display(); return ;
}

运行结果:

x =10, y = 20

x = 20, y = jack

x = java, y = android

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

三.部分显式具体化

#include <iostream>

using namespace std;

// 类模板
template<typename T1, typename T2>
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<typename T1, typename T2>
void Point<T1,T2>::display() const {
cout<<"x="<<m_x<<", y="<<m_y<<endl;
} template<typename T2>
class Point<char*, T2> {
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<typename T2>
void Point<char*,T2>::display() const {
cout<<"x="<<m_x<<" | y="<<m_y<<endl;
} int main() { (new Point<int,int>(,))->display();
(new Point<char*,int>("jack",))->display();
(new Point<char*,char*>("java","android"))->display(); return ;
}

运行结果:

x = 10, y = 20

x = jack | y = 10

x = java | y = android

注意:

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

C++语言基础(19)-模板的显式具体化的更多相关文章

  1. C++语言基础(18)-模板

    Java中的泛型编程可以极大的提升编程的效率,比如在android中查找一个控件的ID:标准写法为: TextView tv_text = (TextView)findViewById(R.id.tv ...

  2. C++语言基础(20)-模板的非类型参数

    一.在函数模板中使用非类型参数 #include <iostream> using namespace std; template<class T> void Swap(T & ...

  3. Java入门 - 语言基础 - 19.方法

    原文地址:http://www.work100.net/training/java-method.html 更多教程:光束云 - 免费课程 方法 序号 文内章节 视频 1 概述 2 方法的定义 3 方 ...

  4. C语言基础(19)-结构体,联合体,枚举和typedef

    一.结构体 1.1 结构体struct定义及初始化 #include <stdio.h> // 这个头文件在系统目录下 #include <stdlib.h> // 使用了sy ...

  5. day02<Java语言基础+>

    Java语言基础(常量的概述和使用) Java语言基础(进制概述和二,八,十六进制图解) Java语言基础(不同进制数据的表现形式) Java语言基础(任意进制到十进制的转换图解) Java语言基础( ...

  6. 02 java语言基础

    常量:字面值常量(字符串,字符,整数,小数,布尔,null),自定义常量,''这个不是字符常量,""这个是字符串常量 进制: 02.01_Java语言基础(常量的概述和使用) A: ...

  7. C++基础--函数模板

    函数模板是通用的函数描述,其使用泛型来定义函数.其实就是有些操作,如果撇开具体的变量的数据类型,其操作是一样的如果我们将这些操作写成一个模板,在调用不同变量的时候就设定好变量类型就可了,后续的操作基本 ...

  8. 并发编程 19—— 显式的Conditon 对象

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  9. C++学习笔记36 (模板的细节明确template specialization)和显式实例(template instantiation)

    C++有时模板很可能无法处理某些类型的. 例如: #include <iostream> using namespace std; class man{ private: string n ...

随机推荐

  1. 【DFS】Codeforces Round #398 (Div. 2) C. Garland

    设sum是所有灯泡的亮度之和 有两种情况: 一种是存在结点U和V,U是V的祖先,并且U的子树权值和为sum/3*2,且U不是根,且V的子树权值和为sum/3. 另一种是存在结点U和V,他们之间没有祖先 ...

  2. Problem C: 零起点学算法18——3个数比较大小

    #include<stdio.h> int main() { int a,b,c; while(scanf("%d %d %d",&a,&b,& ...

  3. 【OpenJudge9267】【递推】核电站

    核电站 总时间限制: 5000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB [描述] 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆 ...

  4. 【sql】sql优化

    sql优化: 1.最左前缀原则 如果contact表上的tenement_id列创建了索引,那么查询的时候将索引列放在最左边,查询的速度会快很多,因为扫描的范围是索引范围而不是整张表范围!! SELE ...

  5. 关于在.NET中 DAL+IDAL+Model+BLL+Web

    其实三层架构是一个程序最基本的 在.Net开发中通常是多层开发比如说    BLL 就是business Logic laywer(业务逻辑层) 他只负责向数据提供者也就是DAL调用数据 然后传递给 ...

  6. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:3.安装Oracle RAC-3.5.安装oracle11gr2 database 软件与创建数据库

    3.5.安装oracle11gr2 database 软件与创建数据库 3.5.1.安装Oracle 11gr2 Database 以oracle 用户登录到节点一,切换到软件安装目录,执行安装. 在 ...

  7. s3c6410 Linux 驱动开发环境搭建

    s3c6410 Linux 驱动开发环境搭建 -- 既然你是做Linux开发的,你还用虚拟机? 非常多人都在win下做开发,于是SD_writer.exe之类的烧写工具"大行其道" ...

  8. Codeforces 553B Kyoya and Permutation

    problem 题意 本题题意不太easy看懂. 给定一个序列,我们能够把这个序列变成一些循环置换的和.然而这样的置换的方法是不止一种的.我们定义一种standard cyclic represent ...

  9. 动态创建的文本框想要加上jQuery的datepicker功能变成日期选择控件该怎么办?

    通常页面输入控件想得到日期选择功能,借助jQuery是这样实现的: 1.载入css和js <script src="jqueryui/jquery-ui.js" type=& ...

  10. HDU 2191悼念512汶川大地震遇难同胞——珍惜如今,感恩生活(多重背包)

    HDU 2191悼念512汶川大地震遇难同胞--珍惜如今.感恩生活(多重背包) http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意: 如果你有资金n元, ...