C++之模板实例化
来源:互联网 发布:cs1.6弹道优化脚本 编辑:程序博客网 时间:2024/05/29 03:17
模板可以分为类模板与函数模板,它们的声明形式分别为:template<typename T1,typename T2,int Size> Class 类名;
template<typename T1...> 返回值类型 函数名(形参表);
其中typename后跟的是类型参数,可以是内置类型,也可以是自定义类型,像Size这种为非类型参数,为固定值。
模板在没有被实例化的情况下是不会生成二进制代码的,其实例化分为三种方式,分别是:
1.隐式实例化
这种实例化是针对函数模板而言的,在发生函数调用时,编译器会先去寻找形参完全匹配的函数,如果没有找到,会对同名的函数模板进行推演,如果推演成功则隐式实例化该模板并完成调用,如果推演失败,则会去调用低一级的匹配函数,如下例所示。
#include<iostream>using namespace std;template <typename T>void func(T t){cout<<t<<endl;}template <typename T>class A{T num;public:A(){num=T(6.8);}void invoke(void(*p)(T)){p(num);}};int main(){A<int>a1;//类的显示模板实参a1.invoke(func);//函数的隐式实例化A<double>a2;a2.invoke(func);}
在主函数里两次调用了func函数,由于普通函数func的声明并不存在,只存在函数模板func的定义,因此会对func函数模板进行推演,若推演能获得成功,则将函数模板隐式实例化,在本例中分别将func模板隐式实例化为void func<int>(int t)及void func<double>(double t),编译后程序里将会存在这两个函数的二进制代码。
2.显示模板实参,下面给出一段程序。
#include <iostream>using namespace std;template <typename T> T Max (const T& t1,const T& t2){return (t1>t2)?t1:t2;}int main(){int i=5;Max (i,'a');//调用失败Max<int>(i,'a');//显示模板实参}直接调用函数Max(i,'a')会失败,这是因为i与‘a’具有不同的类型,在进行函数模板推演的时候会失败,而如果使用显示模板实参Max<int>(i,'a')则直接把模板实例化了,不需要再经过参数推演,并且char型参数'a'会隐式转化为int类型。
3.显式实例化
即在未发生函数调用的时候就将函数实例化,或者在为使用模板类时将类实例化,假设有函数模板template <typename T> void A (const T&)和类模板template <typename T> class B,则其显式实例化分别为:
函数模板的显式实例化:template void A<int> (const int&);
类模板的显式实例化:template class B<int>;- C++(33)模板与泛型之实例化
- 模板实例化(c++)
- C++之模板实例化
- [C++]类模板在何时实例化?
- C++ Template学习笔记之函数模板(2)——函数模板实例化
- C++ Template学习笔记之函数模板(2)——函数模板实例化
- C++primer学习:类模板(2)类模板:模板参数,成员模板和控制实例化
- Linux C/C++ 模板:模板术语 模板参数/模板实参/模板名字/模板ID/特化/实例化
- 工作积累之模板类实例化
- 工作积累之模板类实例化
- C++primer学习:类模板(1):函数模板,模板参数,实例化
- C++ 使用结构类型实例化模板参数
- C++_模板的实例化与具体化。
- STL之准备、总结、模板实例化和特殊化
- C++模板实例化
- 模板的实例化
- 模板实例化事件
- 模板的实例化
- 数据抽取工具Kettle学习
- MySql主从配置 Linux下配置
- 进程间通信-共享内存
- 单点登录
- 【greenplum】ERROR: Interconnect error writing an outgoing packet: Operation not permitted
- C++之模板实例化
- hibernate主键生成机制
- androidStudio设置字体
- msf生成shellcode msfshe
- 自定义添加KAFKA服务启动时报错
- 异地,多活,Mysql数据库改造
- 判断点是否在多边形内部
- jquery导入Excel文件
- Android读取sql文件并导入数据库