目录
非类型模板参数
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
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...