当前位置: 首页 > news >正文

企业网络建站外贸接单十大网站

企业网络建站,外贸接单十大网站,知网被罚8760万,淘宝优惠券微网站开发非类型模板参数 模板参数分为#xff1a;类型模板参数与非类型模板参数 类型模板参数即#xff1a;出现在模板参数列表中#xff0c;跟在class或者typename之后的参数类型名称非类型模板参数即#xff1a;用一个常量作为类(函数)模板的一个参数#xff0c;在类(函数)模… 非类型模板参数   模板参数分为类型模板参数与非类型模板参数 类型模板参数即出现在模板参数列表中跟在class或者typename之后的参数类型名称非类型模板参数即用一个常量作为类(函数)模板的一个参数在类(函数)模板中可将该参数当成常量来使用只支持整型作为非类型模板参数   注意 浮点数、类对象以及字符串是不允许作为非类型模板参数的 非类型的模板参数必须在编译期就能确认结果   templateclass T,size_t N//非类型模板参数N class Stack { private:T _a[N]; }; 模板的特化 概念 通常情况下使用模板可以实现一些与类型无关的代码但对于一些特殊类型的可能会得到一些错误的结果需要特殊处理简单来说模板特化就是针对某些类型进行特殊化处理 以日期类为例日期类的具体实现因为不是此次重点就不展示代码了只需要知道日期类重载了关系运算符 templateclass T bool Less(T left, T right) {return left right; } int main() {cout Less(1, 2) endl; // 可以比较结果正确Date d1(2022, 7, 7);Date d2(2022, 7, 8);cout Less(d1, d2) endl; // 可以比较结果正确日期类重载了关系运算符d1d2可以进行比较Date* p1 d1;Date* p2 d2;cout Less(p1, p2) endl; // 可以比较结果错误比较的是两个指针而不是指针指向的对象return 0; } 此时就需要对模板进行特化。即在原模板类的基础上针对特殊类型所进行特殊化的实现方式。模板特化中分为函数模板特化与类模板特化 函数模板特化   函数模板的特化步骤 1 一定要有原模版 2 template后面接一对空的尖括号 3 函数名后跟一对尖括号尖括号中指定需要特化的类型 templateclass T bool Less(T left, T right) {return left right; }template bool LessDate*(Date*left, Date* right)//对Less函数模板进行特化 {return *left *right; } int main() {cout Less(1, 2) endl; // 可以比较结果正确Date d1(2022, 7, 7);Date d2(2022, 7, 8);cout Less(d1, d2) endl; // 可以比较结果正确Date* p1 d1;Date* p2 d2;cout Less(p1, p2) endl; // 可以比较结果正确走特化之后的return 0; } 注意一般情况下如果函数模板遇到不能处理或者处理有误的类型为了实现简单通常都是将该函数直接给出   如以下是正确写法 templateclass T bool Less(const T left, const T right) {return left right; }template bool LessDate*(Date* const left, Date*const right)//对Less函数模板进行特化 {return *left *right; } 错误写法 正确写法设计的模板特化属实是优点不太适应与其走模板特化不如直接将具体比较函数直接给出 bool Less(Date* left, Date* right) {return *left *right; } 函数模板特化在面对某些比较复杂的形参类型时就显得不那么美好了因此建议函数模板可以不用特化类模板用特化 类模板特化   全特化   全特化即是将模板参数列表中所有的参数都确定化 templateclass T1,class T2 class Date { public:Date(){cout DateT1,T2 endl;} private:T1 _d1;T2 _d2; };template class Dateint, char//类模板全特化 { public:Date(){cout Dateint,char endl;} private:int _d1;char _d2; };int main() {Dateint, int d1;Dateint, chard2;return 0; } 偏特化 偏特化并不仅仅是指特化部分参数更是对模版参数进一步进行条件限制设计的特化版本 比如对于以下模板类   templateclass T1,class T2 class Date { public:Date(){cout DateT1,T2 endl;} private:T1 _d1;T2 _d2; }; 偏特化有以下两种表现方式 一部分参数特化 templateclass T1 class DateT1,int//偏特化 { public:Date(){cout DateT1,int endl;} private:T1 _d1;int _d2; }; 二对模板参数更进一步条件限制 templateclass T1, class T2 class DateT1*, T2*//偏特化为指针类型 { public:Date() { cout DataT1*, T2* endl; } private:T1 _d1;T2 _d2; };templateclass T1, class T2 class DateT1,T2//偏特化为引用类型 { public:Date(){cout DateT1,T2 endl;} private:T1 _d1;T2 _d2; }; int main() {Dateint*, double*d2;Dateint, double d3;return 0; } 类模板特化其他实例 原类模版Less templateclass T class Less { public:bool operator()(const T x, const T y){return x y;} };int main() {Date d1(2023, 10, 20);Date d2(2023, 9, 18);Date d3(2023, 10, 21);vectorDate v1;v1.push_back(d1);v1.push_back(d2);v1.push_back(d3);sort(v1.begin(), v1.end(), LessDate());//Date类对象因为重载了关系运算符所以可以直接比较for (auto e : v1){cout e endl;}return 0; } 若是将vector数组中的存储元素换成Date* 那么排序就会出错因为比较大小时并非使用指针指向的对象而是地址 templateclass T class Less { public:bool operator()(const T x, const T y){return x y;} };int main() {Date d1(2023, 10, 20);Date d2(2023, 9, 18);Date d3(2023, 10, 21);vectorDate* v1;v1.push_back(d1);v1.push_back(d2);v1.push_back(d3);sort(v1.begin(), v1.end(), LessDate*());for (auto e : v1){cout *e endl;}return 0; } 所以可以对Less类模板进行特化针对指针类型的比较特殊化处理 templateclass T class LessT* { public:bool operator()(T* x, T* y){return *x *y;} };int main() {Date d1(2023, 10, 20);Date d2(2023, 9, 18);Date d3(2023, 10, 21);vectorDate* v1;v1.push_back(d1);v1.push_back(d2);v1.push_back(d3);sort(v1.begin(), v1.end(), LessDate*());for (auto e : v1){cout *e endl;}return 0; } 模板分离编译   什么是分离编译   一个程序项目由若干个源文件共同实现而每个源文件单独编译生成目标文件最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式 模板的分离编译   模板的声明与定义分离开若是在头文件中进行声明源文件中完成定义会引发链接错误 A.h templateclass T T Add(const T x, const T y); A.cpp: templateclass T T Add(const T x, const T y) {return x y; } main.cpp: #includeA.hint main() {Add(1, 2);Add(2.3, 6.9);return 0; } 原因 预处理阶段头文件展开在main.cpp中包含了Add函数的声明所以即使没有Add函数的具体实现编译阶段生成汇编代码也是可以通过的可以在链接时call Add函数的地址A.cpp中编译器没有看到Add函数模板的实例化因此不会生成具体的加法函数也就没有Add函数的地址 链接时将多个obj文件合并并处理地址问题在main.cpp中调用的Addint 与 Adddouble 编译器在连接时去找寻地址但是这两个函数没有实例化没有生成具体代码没有地址因此链接时报错 解决方法 法一将声明和定义放到一个文件 xxx.hpp 里面或者xxx.h推荐做法 hpp文件表明既有声明也有定义 因为头文件中既包含了声明也有定义故而编译时直接根据定义实例化直接就有了地址不需要在链接时去寻找地址 A.hpp: templateclass T T Add(const T left, const T right);//声明templateclass T T Add(const T left, const T right)//定义 {return left right; }templateclass T class Stack { public:void push(const T x);//声明void pop();//声明 private:T* _a nullptr;int _top 0;int _capacity 0; };templateclass T void StackT::push(const T x)//定义 {cout void StackT::push(const T x) endl; }templateclass T void StackT::pop()//定义 {cout void StackT::pop() endl; } main.cpp: #includeA.hpp int main() {coutAdd(1, 2)endl ;Stackint().push(1);Stackint().pop();return 0; } 法二模板定义的位置显式实例化。这种方法不实用不推荐使用 模板总结 优点 1. 模板复用了代码节省资源更快的迭代开发C的标准模板库(STL)因此而产生 2. 增强了代码的灵活性 缺点 1. 模板会导致代码膨胀问题也会导致编译时间变长 2. 出现模板编译错误时错误信息非常凌乱不易定位错误
http://www.dnsts.com.cn/news/262576.html

相关文章:

  • 如何做好品牌网站建设南昌定制网站开发费用
  • 怎样给网站做网络推广培训一对一
  • 梁山网站建设公司7天学会自媒体短视频制作
  • 贵州省住房和城乡建设部网站中国软件外包网
  • 网站开发项目文档用前端框架做自适应网站
  • 做网站爱开源网站推广
  • 公司网站开发费用入什么科目腾讯地图如何标注自己店铺位置
  • 网站开发代理江苏wordpress反应好慢
  • 海口网站排名推广wordpress全球销量主题
  • 网站开发先找UI吗教育网站图片
  • 注册网站用于跳转虚拟货币网站违法响应式的网站建设一个多少钱
  • 学习网站大全江苏最新消息今天实时
  • 郑州品牌网站建设费用书店网站建设需求分析调研表
  • 网站搭建费用计入什么科目开发公司空置房拨款合同
  • 网站模板用什么打开东莞公司网站建设
  • 网站报价系统建设电子商务平台网站
  • 哈尔滨专业网站建设爱生活辽宁移动app
  • 网站开发的功能需求文档wordpress右下角添加欢迎弹窗
  • 什么是品牌网站建设WordPress邮件回复stmp
  • 电龙网站建设百度建设网站
  • 用什么服务器做盗版小说网站吗seo代码优化工具
  • 什么网站免费建设商丘网站建设哪家值得信任
  • 公众号制作模板网站优质友情链接
  • 申请专利的网站青岛房产网站
  • 网站设计作用福州做网站公司排名
  • 做网站标题代码easyui做的网站
  • 建设营销型网站的要素wordpress 短信接口
  • 专业做网文的网站视频网站程序模板
  • 网站建设工作室wp主题模板装修家具
  • 搜索引擎网站推广定义在哪个网站开发国外客户