实例化和具体化详解
时间:2022-04-25
本文章向大家介绍实例化和具体化详解,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
primer Plus在解释具体化和实例化看的有点乱,分解出来备忘
在代码中包含函数模板本身并不会生成函数定义,它只是用于生成函数定义的方案
编译器使用模板为我写类型生成函数定义时,得到的是模板实例
如这个模板
template<typename T>
void Swap(T &t1,T &t2)
{
T _t;
_t=t1;
t1=t2;
t2=_t;
}
调用
int i = 10,j=20;
::cout<<"i, j ="<<i<<" , "<<j<<endl;
cout<<" Using compiler -generated int swapper:n";
Swap(i,j);
::cout<<"Now i, j ="<<i<<" , "<<j<<endl;
调用 Swap(i,j)导致编译器生成Swap()的一个实例,该实例使用int类型。模板并非函数定义,但使用int的模板实例是函数定义。 这种实例化方式被称为隐式实例化,编译器之所以知道需要进行定义,是由于程序调用Swap()函数时提供了int 参数。
c++还允许显示实例化
其语法是,声明所需的种类用<>指示类型并在声明前加上template:
template void Swap<int>(int &t1,int &t2);
例子
#include<iostream>
using namespace std;
template<typename T>
void Swap(T &t1,T &t2);
template void Swap<int>(int &t1,int &t2);
int main()
{
cout<<" Using compiler -generated int swapper:n";
int i = 10,j=20;
cout<<"i, j ="<<i<<" , "<<j<<endl;
cout<<" Using compiler -generated int swapper:n";
Swap(i,j);
cout<<"Now i, j ="<<i<<" , "<<j<<endl;
cin.get();
}
template<typename T>
void Swap(T &t1,T &t2)
{
T _t;
_t=t1;
t1=t2;
t2=_t;
}
显示具体化的原型和定义应以template<>打头,并通过名称来指出类型。
显式具体化优先于常规模板,而非模板函数优先于具体化和常规模板
与显式实例化不同的是,显式具体化使用下面的声明方式 ,两种方式是一样的
template<> void Swap<job>(job &c1,job &c2);
template<> void Swap(job &c1,job &c2);
这们的意思是不要使用Swap()模板来生成函数定义,而使用专门的job类型显式地定义函数定义 显式具体化声明在关键字template 后加<>,显式实例化没有
具体化小例子
#include<iostream>
using namespace std;
struct job
{
char name[40];
double salary;
int floor;
};
template<typename T>
void Swap(T &t1,T &t2);
template<> void Swap<job>(job &c1,job &c2);
void show(job j);
int main()
{
job sue={"Suan Yaffee",73000.123,7};
job sidey={"Sidney Taffee",78060.1,2};
cout<<"sue:n";
show(sue);
cout<<"sidey:n";
show(sidey);
Swap(sue,sidey);
cout<<"sue:n";
show(sue);
cout<<"sidey:n";
show(sidey);
cin.get();
}
template<typename T>
void Swap(T &t1,T &t2)
{
T _t;
_t=t1;
t1=t2;
t2=_t;
}
template<> void Swap<job>(job &j1,job &j2)
{
double t1;
int t2;
t1 = j1.salary;
j1.salary=j2.salary;
j2.salary=t1;
t2=j1.floor;
j1.floor=j2.floor;
j2.floor=t2;
}
void show(job j)
{
cout<<"name :"<<j.name<<" salary: "<<j.salary<<" floor : "<<j.floor<<endl;
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python项目跨域问题解决方案
- keras的load_model实现加载含有参数的自定义模型
- opencv 图像加法与图像融合的实现代码
- PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
- python如何实现读取并显示图片(不需要图形界面)
- PHP文件操作实例总结【文件上传、下载、分页】
- Django中Aggregation聚合的基本使用方法
- ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
- PHP反射实际应用示例
- 解决Keras使用GPU资源耗尽的问题
- 如何表示python中的相对路径
- 基于Tensorflow读取MNIST数据集时网络超时的解决方式
- python中的错误如何查看
- python实现斗地主分牌洗牌
- Python Mock模块原理及使用方法详解