一、非类型模板参数模板参数分为类型模板形参即出现在模板参数列表中跟在class或者typename之类的参数类型名称。非类型模板形参就是用一个常量作为类(函数)模板的一个参数在类(函数)模板中可将该参数当成常量来使用。在前面的学习中我们已经学习类型模板参数接下来我们一起来看一下非类型模板参数。在我们现阶段的学习中非类型模板参数就是指传的是常量现阶段只能传整型int假设现在我想搞一个静态的栈按照以前的逻辑我们是不是可以搞个宏——代码语言javascriptAI代码解释#define N10 templateclass T class Stack { private: T _a[N]; int _top; };代码语言javascriptAI代码解释void test1() { stackint st;//存储10个数据 stackint st1;//存储1000个数据 }那如果我想存储1000个数据那是不是就要N1000那st中就会有空间浪费这时候非类型模板参数就闪亮登场~~~代码语言javascriptAI代码解释namespace carrot { templateclass T ,size_t N10非类型模板参数可以给缺省值 class Stack { public: Stack() :_a(new T[n]) {} private: T _a[N]; int _top; }; void test1() { Stackint, 10 st1;//存储10个数据的静态栈 Stackint, 1000 st1;//存储1000个数据的静态栈 } }注意C20才开始支持doubleint* 现在只支持整型注意浮点数、类对象以及字符串是不允许作为非类型模板参数的。非类型的模板参数必须在编译期就能确认结果。1.1 array——非类型模板参数的应用ok接下来我们就来介绍一下array——文档array - C Referencearray是一个静态数组它的底层使用了非类型模板参数然后用这个非类型模板参数定义的数组。1.1.1 常用接口我们看到array的接口和前面我们所学容器的接口没有啥区别唯一的区别就是array不支持头插、尾插以及中间插入这是因为空间已经开好了无法进行扩容操作我们看到array是一个静态数组那array和 int a[10] 有啥区别呢array是封装的而a不是封装的。这里还有个一个问题array支持的数组a也支持啊 那为什么要有array?我们可以更好的用这种类型array,开空间更快编译时给空间代码语言javascriptAI代码解释//假如现在我想在一个链表中中的每个节点中存一个数组用array就很方便 listarrayint, 10 lt;传参数数组传参是传指针在函数的内部不能使用范围for而array是引用传参。如果数组想在函数中使用范围for就要将数组的大小传进去。除此之外普通数组也可以使用sort指向数组的指针是天然的迭代器总结再去做其他容器类型或者进行传参时array都有普通数组达不到的优势在前面的学习中我们了解到数组越界是会检查的但是这种检查是抽查靠近临近位置可以查出来——但是这些问题对于array来说简直就是小意思~因为array是运算符重载调用内存严格检查二、模板的定制能力针对特定类型的特化实现2.1 概念所谓“特化”其实就是特殊化处理通常情况下使用模板可以实现一些与类型无关的代码但对于一些特殊类型的可能会得到一些错误的结果需要特殊处理比如实现了一个专门用来进行小于比较的函数模板
C++模板进阶及特化实战指南
一、非类型模板参数模板参数分为类型模板形参即出现在模板参数列表中跟在class或者typename之类的参数类型名称。非类型模板形参就是用一个常量作为类(函数)模板的一个参数在类(函数)模板中可将该参数当成常量来使用。在前面的学习中我们已经学习类型模板参数接下来我们一起来看一下非类型模板参数。在我们现阶段的学习中非类型模板参数就是指传的是常量现阶段只能传整型int假设现在我想搞一个静态的栈按照以前的逻辑我们是不是可以搞个宏——代码语言javascriptAI代码解释#define N10 templateclass T class Stack { private: T _a[N]; int _top; };代码语言javascriptAI代码解释void test1() { stackint st;//存储10个数据 stackint st1;//存储1000个数据 }那如果我想存储1000个数据那是不是就要N1000那st中就会有空间浪费这时候非类型模板参数就闪亮登场~~~代码语言javascriptAI代码解释namespace carrot { templateclass T ,size_t N10非类型模板参数可以给缺省值 class Stack { public: Stack() :_a(new T[n]) {} private: T _a[N]; int _top; }; void test1() { Stackint, 10 st1;//存储10个数据的静态栈 Stackint, 1000 st1;//存储1000个数据的静态栈 } }注意C20才开始支持doubleint* 现在只支持整型注意浮点数、类对象以及字符串是不允许作为非类型模板参数的。非类型的模板参数必须在编译期就能确认结果。1.1 array——非类型模板参数的应用ok接下来我们就来介绍一下array——文档array - C Referencearray是一个静态数组它的底层使用了非类型模板参数然后用这个非类型模板参数定义的数组。1.1.1 常用接口我们看到array的接口和前面我们所学容器的接口没有啥区别唯一的区别就是array不支持头插、尾插以及中间插入这是因为空间已经开好了无法进行扩容操作我们看到array是一个静态数组那array和 int a[10] 有啥区别呢array是封装的而a不是封装的。这里还有个一个问题array支持的数组a也支持啊 那为什么要有array?我们可以更好的用这种类型array,开空间更快编译时给空间代码语言javascriptAI代码解释//假如现在我想在一个链表中中的每个节点中存一个数组用array就很方便 listarrayint, 10 lt;传参数数组传参是传指针在函数的内部不能使用范围for而array是引用传参。如果数组想在函数中使用范围for就要将数组的大小传进去。除此之外普通数组也可以使用sort指向数组的指针是天然的迭代器总结再去做其他容器类型或者进行传参时array都有普通数组达不到的优势在前面的学习中我们了解到数组越界是会检查的但是这种检查是抽查靠近临近位置可以查出来——但是这些问题对于array来说简直就是小意思~因为array是运算符重载调用内存严格检查二、模板的定制能力针对特定类型的特化实现2.1 概念所谓“特化”其实就是特殊化处理通常情况下使用模板可以实现一些与类型无关的代码但对于一些特殊类型的可能会得到一些错误的结果需要特殊处理比如实现了一个专门用来进行小于比较的函数模板