模板的进阶
目录
非类型模板参数
C++11的静态数组容器-array
按需实例化
模板的特化
函数模板特化
类模板特化
全特化与偏特化
模板的分离编译
总结
非类型模板参数
基本概念:模板参数类型分为类类型模板参数和非类类型模板参数
- 类类型模板参数:跟在class 或 typename之后的形参
- 非类类类型模板参数:用一个常量作为类模板的参数
功能:编译时合理分配大小
#include using namespace std; namespace bit { template class array { public: T& operator[](size_t index) { return _array[index]; } const T& operator[](size_t index)const { return _array[index]; } size_t size()const { return _size; } bool empty()const { return 0 == _size; } private: T _array[N]; size_t _size; }; } int main() { bit::array a1; bit::array a2; bit::array a3; return 0; }注意事项:
1、浮点数、类类型的对象及字符串不允许作为非类类型模板参数
2、非类类型模板参数是在编译时传参,函数参数是在运行时传参
3、函数参数(T 对象1,T 对象2)| 模板参数
C++11的静态数组容器-array
array文档: - C++ Reference (cplusplus.com)"> - C++ Reference (cplusplus.com)
#include #include #include using namespace std; int main() { std::array a1; int a2[10]; //越界读,检查不出来 a2[10]; //越界写,抽查,局限多,很多位置查不出来(x86环境下运行a2[15]不报错,a[10] = 1报错) a2[15] = 1; //任意读写越界都能检查出来 a1[10];//报错 return 0; }优点: 可以避免数组越界问题(但实际上这些内容vector就可以做到,array没啥用)
std::vector v1(10,0); v1[10]//v1[10]也可以检测出
缺点:会出现栈溢出问题
std::array a3;//报错 std::vector v2(1000000,0);//正确
按需实例化
include #include #include #include using namespace std; namespace bit { template class array { public: T& operator[](size_t index) { assert(index d._day); } private: int _year; int _month; int _day; }; ostream& operator
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

