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

网站建设招商dw制作企业网站

网站建设招商,dw制作企业网站,谷歌seo是什么,做建材上哪个网站比较好1.模板C 的模板一直是这门语言的一种特殊的艺术#xff0c;模板甚至可以独立作为一门新的语言来进行使用。模板的哲学在于将一切能够在编译期处理的问题丢到编译期进行处理#xff0c;仅在运行时处理那些最核心的动态服务#xff0c;进而大幅优化运行期的性能。因此模板也被…1.模板C 的模板一直是这门语言的一种特殊的艺术模板甚至可以独立作为一门新的语言来进行使用。模板的哲学在于将一切能够在编译期处理的问题丢到编译期进行处理仅在运行时处理那些最核心的动态服务进而大幅优化运行期的性能。因此模板也被很多人视作 C 的黑魔法之一。1.1外部模板传统 C 中模板只有在使用时才会被编译器实例化。换句话说只要在每个编译单元文件中编译的代码中遇到了被完整定义的模板都会实例化。这就产生了重复实例化而导致的编译时间的增加。并且我们没有办法通知编译器不要触发模板的实例化。为此C11 引入了外部模板扩充了原来的强制编译器在特定位置实例化模板的语法使我们能够显式的通知编译器何时进行模板的实例化template class std::vectorbool; // 强行实例化 extern template class std::vectordouble; // 不在该当前编译文件中实例化模板1.2 尖括号 在传统 C 的编译器中一律被当做右移运算符来进行处理。但实际上我们很容易就写出了嵌套模板的代码std::vectorstd::vectorint matrix;这在传统 C 编译器下是不能够被编译的而 C11 开始连续的右尖括号将变得合法并且能够顺利通过编译。甚至于像下面这种写法都能够通过编译templatebool T class MagicType {bool magic T; }; // in main function: std::vectorMagicType(12) magic; // 合法, 但不建议写出这样的代码1.3类型别名模板在了解类型别名模板之前需要理解『模板』和『类型』之间的不同。仔细体会这句话模板是用来产生类型的。在传统 C 中typedef 可以为类型定义一个新的名称但是却没有办法为模板定义一个新的名称。因为模板不是类型。例如templatetypename T, typename U class MagicType { public:T dark;U magic; }; // 不合法 templatetypename T typedef MagicTypestd::vectorT, std::string FakeDarkMagic;C11 使用 using 引入了下面这种形式的写法并且同时支持对传统 typedef 相同的功效通常我们使用 typedef 定义别名的语法是typedef 原名称 新名称;但是对函数指针等别名的定义语法却不相同这通常给直接阅读造成了一定程度的困难。typedef int (*process)(void *); using NewProcess int(*)(void *); templatetypename T using TrueDarkMagic MagicTypestd::vectorT, std::string; int main() {TrueDarkMagicbool you; }1.4变长参数模板模板一直是 C 所独有的黑魔法一起念Dark Magic之一。 在 C11 之前无论是类模板还是函数模板都只能按其指定的样子 接受一组固定数量的模板参数而 C11 加入了新的表示方法 允许任意个数、任意类别的模板参数同时也不需要在定义时将参数的个数固定。templatetypename... Ts class Magic;模板类 Magic 的对象能够接受不受限制个数的 typename 作为模板的形式参数例如下面的定义class Magicint,std::vectorint,std::mapstd::string,std::vectorint darkMagic;既然是任意形式所以个数为 0 的模板参数也是可以的class Magic nothing;。如果不希望产生的模板参数个数为 0可以手动的定义至少一个模板参数templatetypename Require, typename... Args class Magic;变长参数模板也能被直接调整到到模板函数上。传统 C 中的 printf 函数 虽然也能达成不定个数的形参的调用但其并非类别安全。 而 C11 除了能定义类别安全的变长参数函数外 还可以使类似 printf 的函数能自然地处理非自带类别的对象。 除了在模板参数中能使用 ... 表示不定长模板参数外 函数参数也使用同样的表示法代表不定长参数 这也就为我们简单编写变长参数函数提供了便捷的手段例如templatetypename... Args void printf(const std::string str, Args... args);那么我们定义了变长的模板参数如何对参数进行解包呢首先我们可以使用 sizeof... 来计算参数的个数templatetypename... Ts void magic(Ts... args) {std::cout sizeof...(args) std::endl; }我们可以传递任意个参数给 magic 函数magic(); // 输出0 magic(1); // 输出1 magic(1, ); // 输出2其次对参数进行解包到目前为止还没有一种简单的方法能够处理参数包但有两种经典的处理手法1. 递归模板函数递归是非常容易想到的一种手段也是最经典的处理方法。这种方法不断递归地向函数传递模板参数进而达到递归遍历所有模板参数的目的#include iostream templatetypename T0 void printf1(T0 value) {std::cout value std::endl; } templatetypename T, typename... Ts void printf1(T value, Ts... args) {std::cout value std::endl;printf1(args...); } int main() {printf1(1, 2, 123, 1.1);return 0; }2. 变参模板展开你应该感受到了这很繁琐在 C17 中增加了变参模板展开的支持于是你可以在一个函数中完成 printf 的编写templatetypename T0, typename... T void printf2(T0 t0, T... t) {std::cout t0 std::endl;if constexpr (sizeof...(t) 0) printf2(t...); }事实上有时候我们虽然使用了变参模板却不一定需要对参数做逐个遍历我们可以利用 std::bind 及完美转发等特性实现对函数和参数的绑定从而达到成功调用的目的。3. 初始化列表展开递归模板函数是一种标准的做法但缺点显而易见的在于必须定义一个终止递归的函数。这里介绍一种使用初始化列表展开的黑魔法templatetypename T, typename... Ts auto printf3(T value, Ts... args) {std::cout value std::endl;(void) std::initializer_listT{([args] {std::cout args std::endl;}(), value)...}; }在这个代码中额外使用了 C11 中提供的初始化列表以及 Lambda 表达式的特性下一节中将提到。通过初始化列表(lambda 表达式, value)... 将会被展开。由于逗号表达式的出现首先会执行前面的 lambda 表达式完成参数的输出。 为了避免编译器警告我们可以将 std::initializer_list 显式的转为 void。1.5折叠表达式C 17 中将变长参数这种特性进一步带给了表达式考虑下面这个例子#include iostream templatetypename ... T auto sum(T ... t) {return (t ...); } int main() {std::cout sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) std::endl; }1.6非类型模板参数推导前面我们主要提及的是模板参数的一种形式类型模板参数。template typename T, typename U auto add(T t, U u) {return tu; }其中模板的参数 T 和 U 为具体的类型。 但还有一种常见模板参数形式可以让不同字面量成为模板参数即非类型模板参数template typename T, int BufSize class buffer_t { public:T alloc();void free(T item); private:T data[BufSize]; } buffer_tint, 100 buf; // 100 作为模板参数在这种模板参数形式下我们可以将 100 作为模板的参数进行传递。 在 C11 引入了类型推导这一特性后我们会很自然的问既然此处的模板参数 以具体的字面量进行传递能否让编译器辅助我们进行类型推导 通过使用占位符 auto 从而不再需要明确指明类型 幸运的是C17 引入了这一特性我们的确可以 auto 关键字让编译器辅助完成具体类型的推导 例如template auto value void foo() {std::cout value std::endl;return; } int main() {foo10(); // value 被推导为 int 类型 }2.总结模板对于C程序的效率和可复用性有较大的帮助但同时会降低代码的可读性不建议过度使用模板否则编写的代码可维护性较差。
http://www.tj-hxxt.cn/news/220900.html

相关文章:

  • 营销网站建设规划方案贵阳网站建设是什么
  • 北京响应式网站建设公司宁波网站建设报价
  • 做网站的图片从哪里找最快新闻资讯在哪看
  • 网站建设公司华网天网页制作搜题软件
  • 网站建设具体工作总结做石材的一般用什么网站
  • 龙岩做网站改版找哪家公司深圳哪家网站公司好
  • 网站打开不了怎样做app首页设计模板
  • 网站icon图标怎么加学做网站课程
  • 社区建立网站建站网站教程视频教程
  • 滨江网站制作网页版微信官方下载
  • 二 网站建设的重要性诸城建设局网站
  • 合肥网站建设平台网站子站点是什么意思
  • 营销效果分析怎么写seo网站外链工具
  • 海口建设企业网站微信公众号开发教程视频
  • 广州建设网站服务北京网站平台建设公司
  • 网站开发报价表格式模板北京做网站好
  • 网站设置页面指什么软件发布流程
  • 哈尔滨做网站设计企业网站产品优化怎么做
  • 英文案例网站平台公司是什么
  • wap网站一览asp影楼网站数据库用什么软件
  • 连连跨境电商网站怎么做四川网站建设套餐
  • 天晴创艺网站建设百度小程序互联网产品设计网站
  • 太仓网站建设教程搜索引擎和门户网站的区别
  • 花生壳软件做的网站计算机网络可以向用户提供的服务
  • 怎样做彩票投资网站网站开发需求文件
  • 凡科网站做网站多少钱淘宝客自建网站做还是用微信qq做
  • 阳江网站建设推广关于优化培训
  • 江门网站建设运营团队wordpress列表翻页有page
  • 深圳模板网站建设哪家好太原建南站
  • 网页界面设计网站重庆百度推广关键词优化