当前位置:网站首页>模板的进阶
模板的进阶
2022-07-04 23:28:00 【汐 风】
模板的进阶
非类型模板参数
//非类型模板参数--规定必须是整型常量
template<class T,size_t N=100>
struct Stack
{
//如果就是想定义一个静态栈,就可以采用这种方法
private:
T _st[N];
size_t _top;
};
模板的特化
概念
通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊的类型可能会得到一些错误的结果,就需要对模板进行特化。即:在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板特化中分为函数模板特化与类模板特化
函数模板的特化
函数模板的特化步骤:
- 必须要先有一个基础的函数模板
- 关键字template后面接一对空的尖括号<>
- 函数名后跟一对尖括号,尖括号中指定需要特化的类型
- 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。
//函数模板的特化
//这个就是正常的函数模板匹配
template <class T>
bool Objless(T d1 , T d2) //1
{
return d1 < d2;
}
bool Objless( yyr::Date*& p1, yyr::Date*& p2) //2
{
return *p1 < *p2;
}
//这种方法就是函数模板的特化
template<>
bool Objless<yyr::Date*>(yyr::Date* p1, yyr::Date* p2)//3
{
return *p1 < *p2;
}
//函数模板的特化比较鸡肋,在实际应用中完全可以重载一个Date* 为参数的函数,2和3可以同时存在,并且编译器会自动调用2
void fun3()
{
//在使用过程中难免会遇到这样的问题,以日期类来举例子
cout << Objless(1, 2) << endl;//这是没有问题的
yyr::Date* d1 = new yyr::Date(2022, 3, 20);
yyr::Date* d2 = new yyr::Date(2022, 5, 30);
cout << Objless(d1, d2) << endl;//如果没有2,运行出来是有问题的,他比较的是指针
}
注意:一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数直接给出。
类模板的特化
全特化
全特化即是将模板参数列表中所有的参数都确定化,非类型模板参数也能够特化。
//类模板特化的经典场景:
template<class T>
struct Less
{
bool operator()(const T& x.const T& y) const
{
return x < y;
}
};
//当是日期类的时候,不能简单的比较,而是需要解引用之后再比较
template<>
struct Less<Date*>
{
bool operator()(const Date*& d1, const Date*& d2) const
{
return *d1 < *d2;
}
};
偏特化
偏特化:任何针对模版参数进一步进行条件限制设计的特化版本。
template<class T1,class T2>
class date //定义一个类模板
{
public:
date()
{
cout << typeid(T1).name() << "----";
cout << typeid(T2).name() << endl;
}
};
//全特化
template<>
class date<int, char>
{
public:
date()
{
cout << "int,char" << endl;
}
};
//以下都是偏特化
template<class T1,class T2>
class date<T1*, T2*>
{
public:
date()
{
cout << "T1*, T2*" << endl;
}
};
template<class T>
class date<T, char>
{
public:
date()
{
cout << "T,char" << endl;
}
};
template<class T1, class T2>
class date<T1&, T2&>
{
public:
date()
{
cout << "T1&, T2&" << endl;
}
};
void fun1()
{
//观察以下函数走的是上面的哪个模板
date<int, int> d1;
date<int, char> d2;
date<int*, double*> d3;
date<double, char> d4;
date<int&, double&> d5;
}
模板的分离编译
头文件中的pragma once,就是可以预防重复展开。
什么是分离编译
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链
接起来形成单一的可执行文件的过程称为分离编译模式 。
优势:声明和定义分离的优势就是方便维护,看.h了解框架设计的基本功能,看.cpp了解具体实现细节。
模板的分离编译(出现的是链接问题,不是声明问题)
首先编译器不支持模板的分离编译,有两种解决方法
//假设下面的是函数实现的cpp文件,声明在.h文件中
template<class T>
void funA(const T& A)
{
cout << "funA() " << A << endl;
}
//1.显示实例化
//但是这种很怪异,感觉失去了泛型的意义,因为需要什么都需要这样提前实例化一下
template
void funA<int>(const int& A);
//2、定义跟声明不分离(推荐)
//使用它的地方,头文件展开之后直接就有模板的定义和实例化,就可以直接获得地址,不需要在进行链接
//这是使用funA函数的cpp文件
int main()
{
funA<int>(20);//如果没有显示实例化是编译不通过的
}
模板总结
【优点】
- 模板复用了代码,节省资源,更快的迭代开发,**C++的标准模板库(STL)**因此而产生
- 增强了代码的灵活性
【缺点】
模板会导致代码膨胀问题,也会导致编译时间变长(但是这个不可避免,本身需要我们自己写的代码交给编译器去写了)
出现模板编译错误时,错误信息非常凌乱,不易定位错误
边栏推荐
- Docker镜像的缓存特性和Dockerfile
- Redis: redis transactions
- qt绘制网络拓补图(连接数据库,递归函数,无限绘制,可拖动节点)
- 如何将自己的代码作品快速存证,已更好的保护自己劳动成果
- go踩坑——no required module provides package : go.mod file not found in current directory or any parent
- PMP certificate renewal process
- js正则表达式之中文验证(转)
- [binary tree] the maximum difference between a node and its ancestor
- 【kotlin】第三天
- LIst 相关待整理的知识点
猜你喜欢

机器人强化学习——Learning Synergies between Pushing and Grasping with Self-supervised DRL (2018)

使用快解析搭建自己的minecraft服务器

C language to quickly solve the reverse linked list

Actual combat simulation │ JWT login authentication

ECCV 2022 | Tencent Youtu proposed disco: the effect of saving small models in self supervised learning

Using the uniapp rich text editor

香港珠宝大亨,22亿“抄底”佐丹奴

Redis: redis message publishing and subscription (understand)

【kotlin】第三天

Hash table, hash function, bloom filter, consistency hash
随机推荐
Ffmpeg quick clip
cout/cerr/clog的区别
【js】-【动态规划】-笔记
Header file duplicate definition problem solving "c1014 error“
Jar batch management gadget
Expand your kubecl function
Solve the problem that the virtual machine cannot be remotely connected through SSH service
企业里Win10 开启BitLocker锁定磁盘,如何备份系统,当系统出现问题又如何恢复,快速恢复又兼顾系统安全(远程设备篇)
Redis: redis message publishing and subscription (understand)
推荐收藏:跨云数据仓库(data warehouse)环境搭建,这货特别干!
Acrel-EMS综合能效平台在校园建设的意义
蓝天NH55系列笔记本内存读写速度奇慢解决过程记录
Using fast parsing intranet penetration to realize zero cost self built website
qt绘制网络拓补图(连接数据库,递归函数,无限绘制,可拖动节点)
Mysql database backup and recovery -- mysqldump command
Phpcms paid reading function Alipay payment
Redis:Redis消息的发布与订阅(了解)
高通WLAN框架学习(30)-- 支持双STA的组件
OSEK standard ISO_ 17356 summary introduction
How to do the project of computer remote company in foreign Internet?