访问wap网站郑州网站建设代理
2026/5/21 18:06:33 网站建设 项目流程
访问wap网站,郑州网站建设代理,tornado 做网站,狮山公司网站建设C的模板参数有哪些#xff1f; 模板#xff08;Template#xff09;#xff1a;是泛型编程的核心机制#xff0c;允许在编写代码时使用参数化的类型或值#xff0c;从而实现代码的复用。 模板的参数分为两大类#xff1a;类型参数和非类型参数#xff0c;此外还有 模板…C的模板参数有哪些模板Template是泛型编程的核心机制允许在编写代码时使用参数化的类型或值从而实现代码的复用。模板的参数分为两大类类型参数和非类型参数此外还有模板模板参数较少见注博主可没有打错字哦~名字真的就叫作模板模板参数啊一、类型参数类型参数Type Parameters表示模板中使用的数据类型可以是内置类型如int、double或者是自定义类型如类、结构体1. 通用类型参数使用class或typename声明两者含义相同推荐用typename更清晰代码语言javascriptAI代码解释template class T // 类型参数 T void swap(T a, T b) { T temp a; a b; b temp; } template typename U // 等价于 class U class Vector { /* ... */ };示例调用代码语言javascriptAI代码解释swapint(3, 5); // 显式指定类型为 int swapdouble(3.14, 2.71); // 显式指定类型为 double // 也可隐式推导类型swap(3, 5);编译器自动推导为 int2. 默认类型参数可以为类型参数指定默认类型调用时若未指定则使用默认值代码语言javascriptAI代码解释template typename T int // 默认类型为 int class Stack { // ... }; Stack s; // 使用默认类型 int Stackdouble d; // 显式指定类型为 double二、非类型参数非类型参数Non-Type Parameters表示模板中使用的常量值通常为整型、枚举值或指针/引用C11 后支持std::nullptr_t、constexpr变量等1. 基本语法代码语言javascriptAI代码解释template typename T, int Size // T 是类型参数Size 是非类型参数整数 class Array { private: T data[Size]; // 使用非类型参数 Size 作为数组长度 public: int getSize() const { return Size; } };2. 限制条件非类型参数必须是编译期可确定的常量不能是变量或运行时计算的值代码语言javascriptAI代码解释Arrayint, 10 arr; // 合法10 是编译期常量 int n 10; // Arrayint, n arr; // 非法n 是变量非编译期常量对于指针/引用类型的非类型参数要求其指向的对象具有静态存储期如全局变量、static变量代码语言javascriptAI代码解释int global_var 0; template int* ptr void func() { /* ... */ } funcglobal_var(); // 合法指向全局变量代码案例非类型参数的使用小案例代码语言javascriptAI代码解释namespace mySpace { //任务定义的一个“静态数组”的模板类同时要使用“非类型参数” templateclass T, size_t N 10 class array { private: T _array[N]; //1.存储数据的静态数组 注意在编译期确定数组大小 size_t _size; //2.记录数组中有效元素数量的变量 public: //1.实现“普通版本的下标运算符[]的重载函数” T operator[](size_t index) //注意支持对数组元素的读写操作 { return _array[index]; } //2.实现“const版本的下标运算符[]的重载函数” const T operator[](size_t index)const //注意保证在只读场景下也能通过下标访问元素返回的是 const 引用确保元素不会被修改 { return _array[index]; } //3.实现“获取数组中有效元素的数量的操作” size_t size()const { return _size; } //4.实现“判断数组是否为空的操作” bool empty()const { return _size 0; } }; }三、模板模板参数模板模板参数Template Template Parameters是指模板本身作为参数用于将另一个模板传递给当前模板。 注暂时先了解一下概念即可------------模板特化------------1. 什么是模板特化模板特化Template Specialization是模板机制的一个重要特性允许针对特定的模板参数类型提供模板的定制化实现。它允许针对特定类型或值定制模板的行为解决通用模板在特殊场景下的 “水土不服” 问题。当模板在某些特定类型下需要不同的行为或更高效的实现时特化可以让代码更灵活、更贴合需求。2. 为什么要使用模板特化在介绍的模板特化的时候我们说模板特化是多么的厉害但是口说无凭模板特化真的有那么好吗 下面的我们就来看一看模板特化的重要性。代码语言javascriptAI代码解释#include iostream using namespace std; //任务1定义一个日期类 class Date { public: /*--------------成员变量--------------*/ int _year; int _month; int _day; /*--------------成员函数--------------*/ //1.实现“默认构造函数” Date(int y, int m, int d) : _year(y) , _month(m) , _day(d) {} //2.实现“运算符重载函数” bool operator(const Date other) const //注意用于比较两个日期的先后顺序 { if (_year ! other._year) return _year other._year; // 优先比较年份 if (_month ! other._month) return _month other._month; // 年份相同则比较月份 return _day other._day; // 年份和月份都相同则比较日期 } }; //任务2定义比较函数模板 templateclass T bool Less(T x, T y) { return x y; //注意依赖 T 类型的 operator 实现 } int main() { // ---------------- 基础类型比较正确行为---------------- // 1. 实例化 Lessint(int, int) // 调用内置的 int 类型的 运算符 cout Less(1, 2) endl; // ---------------- 对象类型比较正确行为---------------- // 2. 实例化 LessDate(Date, Date) // 调用 Date 类重载的 operator Date d1(2022, 7, 7); Date d2(2022, 7, 8); cout Less(d1, d2) endl; // ---------------- 指针类型比较潜在问题---------------- // 3. 实例化 LessDate*(Date*, Date*) // 调用指针类型的 运算符比较内存地址 Date* p1 d1; // p1 指向 d1 的内存地址 Date* p2 d2; // p2 指向 d2 的内存地址 cout Less(p1, p2) endl; // 可能输出 0 或 1取决于内存地址的随机分配 //注意此处本意是比较对象内容但实际比较的是指针地址 return 0; }在这里插入图片描述可以看到Less函数在大多数情况下都能正常比较但在特殊场景中会得出错误结果。在上述示例里p1指向的d1显然小于p2指向的d2对象然而Less内部并没有比较p1和p2所指向对象的内容而是比较了p1和p2指针的地址这就无法达成预期进而出现错误哈哈虽然博主在自己的VS上演示的结果没有出错但是并不代表它没有问题呦 这时就需要对模板进行特化处理。也就是在原模板的基础上针对特定类型进行专门化的实现。3. 模板特化有哪些模板特化的分类C 的模板特化可分为函数模板特化和类模板特化两大类。一、函数模板特化函数模板特化的步骤1. 先定义基础函数模板要特化函数模板得先有一个通用的基础函数模板它为各类型提供默认的泛型逻辑。比如我们想实现 “比较两个值大小返回bool结果” 的功能先写通用模板代码语言javascriptAI代码解释template class T bool Less(T left, T right) { return left right; }这个模板能处理int、double、自定义类若重载了运算符 等类型的比较但遇到指针类型时会因比较地址而非内容出问题这就需要特化。2. 添加特化声明与实现特化标识用template表明这是一个模板特化空尖括号表示不再推导模板参数明确特化类型在函数名后的尖括号里写上要专门处理的特定类型如Date*类型就写LessDate*保持形参匹配特化函数的形参列表必须和基础函数模板的形参类型严格一致否则编译器可能报错或匹配异常前面我们提到Less函数在比较p1和p2时内部并未比较它们所指向对象的内容而是直接比较了指针的地址这与预期不符会导致错误。 此时需要通过模板特化来解决这一问题。 既然已经了解了模板特化的方法接下来我们就按照上面的步骤对代码进行特化处理吧代码语言javascriptAI代码解释#include iostream using namespace std; //任务1定义一个日期类 class Date { public: /*--------------成员变量--------------*/ int _year; int _month; int _day; /*--------------成员函数--------------*/ //1.实现“默认构造函数” Date(int y, int m, int d) : _year(y) , _month(m) , _day(d) {} //2.实现“运算符重载函数” bool operator(const Date other) const //注意用于比较两个日期的先后顺序 { if (_year ! other._year) return _year other._year; // 优先比较年份 if (_month ! other._month) return _month other._month; // 年份相同则比较月份 return _day other._day; // 年份和月份都相同则比较日期 } }; //任务2定义比较函数模板Less templateclass T bool Less(T left, T right) { return left right; //注意依赖 T 类型的 operator 实现 } //任务3对Less函数模板进行特化 template bool LessDate*(Date* left, Date* right) { return *left *right; } int main() { // ---------------- 基础类型比较正确行为---------------- // 1. 实例化 Lessint(int, int) // 调用内置的 int 类型的 运算符 cout Less(1, 2) endl; // ---------------- 对象类型比较正确行为---------------- // 2. 实例化 LessDate(Date, Date) // 调用 Date 类重载的 operator Date d1(2022, 7, 7); Date d2(2022, 7, 8); cout Less(d1, d2) endl; // ---------------- 指针类型比较潜在问题---------------- // 3. 实例化 LessDate*(Date*, Date*) // 调用指针类型的 运算符比较内存地址 Date* p1 d1; // p1 指向 d1 的内存地址 Date* p2 d2; // p2 指向 d2 的内存地址 cout Less(p1, p2) endl; //注意调用特化之后的版本了而不是走通用模板了 return 0; }在这里插入图片描述函数模板全特化函数模板全特化为函数模板的所有参数显式指定类型完全覆盖通用逻辑。语法代码语言javascriptAI代码解释template //函数模板特化 返回类型 模板函数名特化类型(参数列表) { ... }示例通用函数模板用于比较两个值的大小但对const char*C 风格字符串默认会比较指针地址而非内容所以需要特化代码语言javascriptAI代码解释#include iostream #include string using namespace std; /*--------------------- 通用模板求最大值---------------------*/ template typename T T max_val(T a, T b) { return a b ? a : b; } /*------------------ 针对const char*类型的全特化 ------------------*/ template // 函数模板全特化 const char* max_valconst char*(const char* a, const char* b) //按字符串字典序比较 { return strcmp(a, b) 0 ? a : b; // 使用 C 风格字符串比较 //注意strcmp 返回值a b 则 0a b 则 0相等则 0 } int main() { /*----------------调用通用模板比较int值----------------*/ cout -----调用通用模板比较int值----- endl; cout max_val(10, 20) endl; /*---------------------- 调用全特化版本比较字符串的内容 ----------------------*/ cout -----调用全特化版本比较字符串的内容----- endl; const char* s1 apple; const char* s2 banana; cout max_val(s1, s2) endl; //注意自动匹配特化版本 return 0; }在这里插入图片描述函数模板偏特化注意C不直接支持函数模板偏特化语法会报错但可通过函数重载模拟类似效果。示例让max_val对指针类型比较指针指向的值而非指针地址通过重载实现指针类型的 “偏特化”代码语言javascriptAI代码解释#include iostream using namespace std; // 通用函数模板比较值 template class T T max_val(T a, T b) { return a b ? a : b; } // 重载版本针对指针类型模拟偏特化 template class T T* max_val(T* a, T* b) { return *a *b ? a : b; } int main() { int x 10, y 20; // 调用通用模板比较 int 值 cout max_val(5, 3) endl; // 调用重载的指针版本比较 *x 和 *y int* result max_val(x, y); cout *result endl; return 0; }在这里插入图片描述原理重载的max_val(T* a, T* b)并非严格意义的 “偏特化”但利用函数重载决议优先匹配指针类型的调用达到 “针对部分类型定制” 的效果。若直接写函数模板偏特化语法如template class T T max_valT*(T* a, T* b) { ... }编译器会报错因此实际开发常用重载替代。www.dongchedi.com/article/7597217223819772478www.dongchedi.com/article/7597215233471889944www.dongchedi.com/article/7597216873696526910www.dongchedi.com/article/7597217143041737241www.dongchedi.com/article/7597214870441935385www.dongchedi.com/article/7597214599947043353www.dongchedi.com/article/7597214580846477886www.dongchedi.com/article/7597216071082738201www.dongchedi.com/article/7597214433031078424www.dongchedi.com/article/7597214537498362392www.dongchedi.com/article/7597215399566361150www.dongchedi.com/article/7597215658752868888www.dongchedi.com/article/7597215102077141528www.dongchedi.com/article/7597214696924004889www.dongchedi.com/article/7597213042329895448www.dongchedi.com/article/7597215125493400126www.dongchedi.com/article/7597212587801018905www.dongchedi.com/article/7597214580846215742www.dongchedi.com/article/7597214267869692440www.dongchedi.com/article/7597213056480969278www.dongchedi.com/article/7597212812516639257www.dongchedi.com/article/7597212812516868633www.dongchedi.com/article/7597213320844182041www.dongchedi.com/article/7597211160895046206www.dongchedi.com/article/7597211076186374681www.dongchedi.com/article/7597212587801477657www.dongchedi.com/article/7597210839670080062www.dongchedi.com/article/7597210276412899864www.dongchedi.com/article/7597211030086926872www.dongchedi.com/article/7597211160895078974www.dongchedi.com/article/7597209997126238744www.dongchedi.com/article/7597209064238039577www.dongchedi.com/article/7597211030087287320www.dongchedi.com/article/7597209862904480318www.dongchedi.com/article/7597209319725253145www.dongchedi.com/article/7597208525277987353www.dongchedi.com/article/7597208525278151193www.dongchedi.com/article/7597210268858958398www.dongchedi.com/article/7597209475426435609www.dongchedi.com/article/7597209772429476377www.dongchedi.com/article/7597201951176213017www.dongchedi.com/article/7597201687174562366www.dongchedi.com/article/7597199724889997849www.dongchedi.com/article/7597199550092657177www.dongchedi.com/article/7597200248943329816www.dongchedi.com/article/7597199001863701017www.dongchedi.com/article/7597198298541834777www.dongchedi.com/article/7597200591446000190www.dongchedi.com/article/7597199968348357145www.dongchedi.com/article/7597199312984162841www.dongchedi.com/article/7597199429019861566www.dongchedi.com/article/7597196791863902782www.dongchedi.com/article/7597197725960110616www.dongchedi.com/article/7597197533550920217www.dongchedi.com/article/7597196766895079960www.dongchedi.com/article/7597197878439756313www.dongchedi.com/article/7597196909912031768www.dongchedi.com/article/7597195764053492248www.dongchedi.com/article/7597196370181030424www.dongchedi.com/article/7597195961618121241www.dongchedi.com/article/7597195004385182232www.dongchedi.com/article/7597196281857442366www.dongchedi.com/article/7597195368090075673www.dongchedi.com/article/7597195809683505689www.dongchedi.com/article/7597194439940932158www.dongchedi.com/article/7597194164794933822www.dongchedi.com/article/7597194060553749016www.dongchedi.com/article/7597195414877995544www.dongchedi.com/article/7597194911112479256www.dongchedi.com/article/7597194219174068761www.dongchedi.com/article/7597192718418756120www.dongchedi.com/article/7597191743318065689www.dongchedi.com/article/7597194069471003161www.dongchedi.com/article/7597193401016500760www.dongchedi.com/article/7597192147254772286www.dongchedi.com/article/7597192394672505406www.dongchedi.com/article/7597190301329080894www.dongchedi.com/article/7597188998091833881www.dongchedi.com/article/7597190006675243582www.dongchedi.com/article/7597189866363372056

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询