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

防城港市网站建设_网站建设公司_AJAX_seo优化

做网站一天打多少个电话,潍坊市建设银行坊子支行网站,solaris.wordpress,做下载类网站赚钱吗我们在之前的博客中讲述过模版的使用#xff1a;【C】模版初阶#xff0c;但这只是模版最基本的使用#xff0c;下面再深入模版#xff0c;看看还有另外什么用法#xff1a; 目录 一、非类型模板参数 二、模板的特化 2.1 什么是模版的特化 2.2 函数模版的特化 2.3 类… 我们在之前的博客中讲述过模版的使用【C】模版初阶但这只是模版最基本的使用下面再深入模版看看还有另外什么用法 目录 一、非类型模板参数 二、模板的特化 2.1 什么是模版的特化 2.2 函数模版的特化 2.3 类模版的特化 2.3.1 全特化 2.3.2 偏特化 三、模板的分离编译 3.1 解决方法 一、非类型模板参数 我们知道模版可以传递类型参数除此之外还可以传递非类型参数 例如 #define N 10 templateclass T struct Static_sequence {T a[N]; }; 上诉代码可以建立一个任意类型的静态顺序表但是N值是确定的我们如何建立我们想要的大小的静态顺序表呢 再来看看下面的代码 templateclass T, size_t N 10 struct Static_sequence {T a[N]; }; 我们在模版上再加一个非类型参数size_t N这个参数可以传入我们需要的值来初始化静态顺序表 int main() {Static_sequenceint, 20 q;return 0; } 在上述代码中我们传入了一个20可以看到开辟了一个20个元素的静态数组 对于该非类型模板参数我们只能设定整型家族int/char/short/...对于其他类型是不支持的例如 对于设定的非类型模板参数系统是将其作为常量看待的所以它可以初始化数组元素个数 例如我们想要对传入的值做修改 编译器是不能通过的 二、模板的特化 2.1 什么是模版的特化 通常情况下使用模板可以实现一些与类型无关的代码但对于一些特殊类型的可能会得到一些错误的结果需要特殊处理比如指针类型的比较 class Date {friend ostream operator(ostream out, const Date d); public:Date(int year, int month, int day)//构造函数{if (month 1 || month12 || (day1 || dayGetMonthDay(year, month)))//判断日期是否合法{cout Illegal date! endl;}else{_year year;_month month;_day day;}}int GetMonthDay(int year, int month) const//获取year年month月的天数{int MonthDay[12] { 31,28,31,30,31,30,31,31,30,31,30,31 };//用数组来依次存储平年1到12月的天数if (month 2 ((year % 4 0 year % 100 ! 0) || year % 400 0))//判断是否为闰年的2月{return 29;}return MonthDay[month - 1];}//运算符重载bool operator(const Date d) const//判断日期是否相同{return _year d._year _month d._month _day d._day;}bool operator!(const Date d) const//判断日期是否不相同{return !(*this d);}bool operator(const Date d) const//判断当前日期是否在传入日期之前{return _year d._year || (_year d._year _month d._month) || (_year d._year _month d._month _day d._day);}bool operator(const Date d) const//判断当前日期是否在传入日期之前或相同{return (*this d) || (*this d);}bool operator(const Date d) const//判断当前日期是否在传入日期之后{return !(*this d);}bool operator(const Date d) const//判断当前日期是否在传入日期之后或相同{return !(*this d);}private:int _year;int _month;int _day; };ostream operator(ostream out, const Date d) {out d._year / d._month / d._day endl;return out; }// 函数模板 -- 参数匹配 templateclass T bool Less(const T x, const T y) {return x y; }int main() {std::cout Less(Date(2022, 9, 27), Date(2022, 9, 25)) endl;//Date类型比较std::cout Less(new Date(2022, 10, 27), new Date(2022, 10, 25)) endl;//Date指针类型比较return 0; } 比较结果 因为我们在Date类中运算符重载了的比较方法所以对于Date类可以直接调用该方法进行比较但是对于Date*类型模版找不到比较方法只能默认比较地址空间的大小导致了结果的错误 为了解决该问题我们引入模版的特化 2.2 函数模版的特化 函数模板的特化步骤 1.必须要先有一个基础的函数模板 2.关键字template后面接一对空的尖括号 3.函数名后跟一对尖括号尖括号中指定需要特化的类型 4.函数形参表: 必须要和模板函数的基础参数类型完全相同如果不同编译器可能会报一些奇怪的错误 下面我们对上面的模版函数进行指针的特例化 // 函数模板 -- 参数匹配 templateclass T bool Less(const T x, const T y) {return x y; }// 对Less函数模板进行特化 template bool LessDate*(Date* x, Date* y) {return *x *y; } 这下结果就正确了  该种实现简单明了代码的可读性高容易书写因为对于一些参数类型复杂的函数模板特化时要特别给出因此函数模板不建议特化平时我们使用实例化解决即可 2.3 类模版的特化 2.3.1 全特化 我们来设置一个类模版 // 类模板 -- 参数匹配 templateclass T class Less {bool operator()(T x, T y){return x y;} };//全特化 template class LessDate* {bool operator()(Date* x, Date* y){return *x *y;} }; 全特化即是将模板参数列表中所有的参数都确定化在上述代码中我们将T类型指明为Date*类型这种将模板参数列表全部指明为一个确定的类型的操作就是全特化 2.3.2 偏特化 偏特化就是任何针对模版参数进一步进行条件限制设计的特化版本 如下我们将类模板参数进一步限制为指针类型但具体为上面类型的指针并未说明 // 类模板 -- 参数匹配 templateclass T class Less {bool operator()(T x, T y){return x y;} };//偏特化对模版参数进一步进行条件限制 templateclass T class LessT* {bool operator()(T* x, T* y){return *x *y;} }; // 类模板 -- 参数匹配 templateclass T1, class T2 class Data { public:Data() { cout DataT1, T2 endl; } private:T1 _d1;T2 _d2; };//两个参数偏特化为指针类型 template typename T1, typename T2 class Data T1*, T2* { public:Data() { cout DataT1*, T2* endl; }private:T1 _d1;T2 _d2; }; //两个参数偏特化为引用类型 template typename T1, typename T2 class Data T1, T2 { public:Data(const T1 d1, const T2 d2)//参数偏特化为引用类型时一定要初始化: _d1(d1), _d2(d2){cout DataT1, T2 endl;}private:const T1 _d1;const T2 _d2; }; //一个参数偏特化为引用类型,一个参数偏特化为指针类型 template typename T1, typename T2 class Data T1, T2* { public:Data(const T1 d1, const T2* d2)//参数偏特化为引用类型时一定要初始化: _d1(d1){cout DataT1, T2* endl;}private:const T1 _d1;T2* _d2; }; 注意参数偏特化为引用类型时一定要初始化使用初始化列表和缺省参数都可 偏特化有还有另一种表现方式 当模版参数有多个时部分特化一部分参数 例如 // 类模板 -- 参数匹配 templateclass T1, class T2 class Data { public:Data() { cout DataT1, T2 endl; } private:T1 _d1;T2 _d2; };// 偏特化,不改变第一个模版参数将第二个参数特化为int template class T1 class DataT1, int { public:Data() { cout DataT1, int endl; } private:T1 _d1;int _d2; }; 三、模板的分离编译 我们现在使用声明和实现分离的编译的方法来实现一个函数模版将类模版的声明放在Func.h头文件中实现代码放在Func.cpp中 Func.h #pragma oncetemplateclass T T Add(const T left, const T right); Func.cpp #includeFunc.htemplateclass T T Add(const T left, const T right) {return left right; } test.cpp #includeFunc.h int main() {int x 5, y 10;Addint(x, y);return 0; } 我们来编译一下 咦怎么编译通过不了还报了一个链接错误 下面我们来仔细分析一下 一份C/C程序要运行一般要经历一下步骤:预处理—--编译---汇编―—--链接不熟悉的同学可以看到这里C语言程序环境_c语言程序运行环境 但是在每个cpp文件经过预处理、编译、汇编但没有进入链接阶段之前都是单独被编译器所编译的。这样会导致由于模版参数没有实例化Func.cpp文件在形成汇编指令时并没有为Add函数开辟函数栈帧因为没有参数的实例化系统压根就不知道要开辟多大的空间来给Add函数用但是由于头文件的展开使汇编会形成call指令这时的call指令并没有填上Add函数所在的栈帧地址所以最终形成的obj文件进入链接时会发现Func.cpp形成的obj文件中并没有上Add函数所在的栈帧地址此时call指令中没有实际地址导致指令无法正常执行最后报错 3.1 解决方法 知道了上面的原理后我们就可以得出相应的解决办法了 1. 将声明和定义放到一个文件 xxx.hpp 里面或者xxx.h其实也是可以的。推荐使用这种。 2. 模板定义的位置显式实例化。但我们不能给每个类型参数都实例化一份代码吧这样要模版参数还有什么意义呢所以这种方法不实用不推荐使用
http://www.ihoyoo.com/news/140796.html

相关文章:

  • 高端网站开发设计简介东莞专业做外贸网站的公司
  • 做网站买完域名还需要什么有免费的wordpress
  • 滨州企业网站建设360网页版登录入口
  • pedl中文模组网站html教程菜鸟教程视频
  • 网站后台更新没有变化中云建设集团网站
  • 网站提交收录软件综述题建设网站需要几个步骤
  • 深圳去聋哑做义工申请网站怎么做网页菜单
  • 北京seo优化wyhseo北京网站优化提供商
  • 绵阳网站维护托管微信小程序 模板
  • 什么叫宣传型网站wordpress 微信主题下载
  • 制作网站的模板下载软件国外主流网站开发技术
  • 全国企业信息官网网站网站模板 国外
  • 招聘网站开发的公司网站不用域名可以吗
  • seo培训学校排名青岛济南网站建设优化
  • phpcms v9 网站建设设计制作网络科技模板ps做网站显示内容参考
  • 推荐十个网站展馆设计论文
  • 南通高端网站建设机构公司网站备案名称
  • 做网站要域名吗php网站安装好后后台无法登陆提示是500是怎么回事?
  • 网站排名优化提升快速html5网站模板免费
  • win7建设网站教程重庆建设摩托车价格及图片
  • 网站建设合同的内容与结构购物网站页面设计图片
  • 青岛网站建设公司正网站建设凭证
  • 网站分站原理开发公司认领工程网站
  • 淘宝客网站建设教程html底部的版权代码
  • 大学专业网站学习做网站难吗
  • 那些外贸网站个人可以做绍兴网站建设公司
  • 杭州活动策划公司有哪些洛阳网站建设优化案例
  • 快手等视频网站做推广宁波高端网站建设推广
  • 咖啡色网站模板专业的手机网站开发
  • 网站托管运营微信小程序怎么关闭未成年模式