C++ 模板元编程系列专题 2:模板特化的概念从何而来

C++ 模板元编程系列专题 2:模板特化的概念从何而来,第1张

如果元编程中所有的变量(或者说元编程的参数),都是类型,那么这样的编程,我们有个特定的称呼,叫“泛型”。

模板的发明,仅仅是为了做和 宏 几乎一样的替换工作吗?可以说是,也可以说不是。

一方面, 模板 可以用来替换类型,这点和宏没什么区别。只是宏在编译阶段基于文本做纯粹替换,被替换的文本本身没有任何语义。而模板会在分析模板时以及实例化模板的时候都会进行检查,而且源代码中也能与调试符号一一对应,所以无论是编译时还是运行时,排错都相对简单。

另一方面,模板和宏也有很大的不同,模板最大的不同在于它是 “可以运算” 的。我们来看一个例子:

上述函数实现了一个 uint8_t 和 uint8_t 类型的加法运算,如果现在要实现 int16 和 int16 类型的加法运算,该怎么办呢?简单点的方法如下:

但是这里有两个难点:

有人说, 重载 虚函数 也能解决如上问题:

甚至在 C 语言中定义新的 结构体 Variant 或使用 void 也能解决该问题:

没错,但是如果我还有 uint9_t、uint10_t 等各种类型的加法运算呢?Anyway,不 管是哪种方法都很难避免 if/else 的存在。

模板与上述这些方法最大的区别在于:模板无论其参数或者是类型,它都是一个编译期分派的方法。编译期就能确定的东西既可以做类型检查,编译器也能进行优化,砍掉任何不必要的代码执行路径。

我们先来看看一个模板的例子:

那么当传入两个不同类型的变量,或者不是 in t 和 float 变量,编译器就会提示错误。

从能力上来看,模板能做的事情都是编译期完成的。编译期完成的意思就是,当你编译一个程序的时候,所有的量就都已经确定了。比如下面的例子:

从 上述代码中我们可以看到:aVar 和 bVar 都一定会是整数。所以 如果有合适的机制,编译器就能知道此处的 AddFloatOrMulInt 中只需要执行 int 路径上的代码,而且编译器在此处也能单独为 int 路径生成代码,从而去掉那个不必要的 if 。在模板代码中,这个“合适的机制”就是指“特化”和“部分特化(Partial Specialization)”,后者也叫“偏特化”。

10 版本 - 伪代码

20 版本 - 函数重载

30 版本 - 纯模板

好吧,问题来了!如何要让两个内容不同,但是模板参数形式相同的类进行区分呢?特化!特化(specialization)是根据一个或多个特殊的整数或类型,给出模板实例化时的一个指定内容

40 版本 - 模板特化

解释:

至此,第一个模板特化的代码已经写完了。这里的 AddFloatOrMulInt 如同是一个函数,却只能在编译期间执行。如果你体味到了这一点,那么恭喜你,你的模板元编程已经开悟了。

本文核心只讲了两个问题:一是为什么需要泛型编程,重点介绍了宏、模板和元编程的关系;二是模板类的特化代码如何编写。关于特化,还有很多细节知识,在之后的文章中我们继续探究,另外将还介绍偏特化等知识点,敬请期待。

Web前端是互联网时代软件产品研发中不可缺少的一种专业研发角色。从狭义上讲,Web前端工程师使用HTML、CSS、Java等专业技能和工具将产品UI设计稿实现成网站产品,涵盖用户PC端、移动端网页,处理视觉和交互问题。从广义上来讲,所有用户终端产品与视觉和交互有关的部分,都是Web前端工程师的专业领域。

就目前Web前端开发可能涉及的语言来讲,有PHP语言、JavaScript、Ruby、HTML5、Java和Python。当然并不是说以上这些语言前端开发工程师都必须掌握,其实只选择一两门熟练掌握即可。下面一起来看看这些Web前端开发语言的具体介绍和自身的优势。

1、JavaScript

JavaScript是一种属于网络的脚本语言,被广泛用于Web应用开发。作为一种动态编程语言,它主要用于增添网站的交互性。作为运行在浏览器中的解释型的编程语言,它的优势也是显而易见的,比如可以轻松实现跨平台、跨浏览器驱动网页以及与用户交互的功能。同时,JavaScript还能开发很多Web框架,如Angularjs、Emberjs以及JavascriptMVC等。

2、PHP语言

常常听说PHP是世界第一的语言,其实这种说法也有一定道理。作为Web架构开发常用语言,PHP开发了很多Web框架,有Zendframework、CakePHP、ThinkPHP等等。PHP独特的语法混合了C、Java、Perl以及PHP自创新的语法。目前,PHP主要用在服务器端上用于Web开发。

PHP语言的优势在于可以更快速的执行动态网页,而且功能强大,支持几乎所有流行的数据库以及操作系统,还可以用C、C++进行程序的扩展!另外,PHP提供了几个框架,比如Laravel和Drupal,帮助开发人员更快地构建应用程序,拥有更高的可扩展性和可靠性。PHP拥有最简单的学习曲线、廉价的托管环境、丰富的学习资源和相对容易的开发环境。这对初学者来说是个不错的选择。

3、HTML5

HTML是超级文本标记语言,是为“网页创建和其他可在网页浏览器中看到的信息”设计的语言。HTML5是由万维网发布的最新的语言规范,是开放的Web网络平台的奠基石,所以做Web前端,精通HTML5是必须要掌握的一项技能。

4、Ruby(与RubyonRails一起使用)

Ruby是一种纯粹的面向对象编程语言。Ruby的特性与Smalltalk、Perl和Python类似。Perl、Python和Smalltalk是脚本语言。Smalltalk是一个真正的面向对象语言。Ruby,与Smalltalk一样,是一个完美的面向对象语言。使用Ruby的语法比使用Smalltalk的语法要容易得多。ruby是一种优秀的纯面向对象的编程语言,学习它可以很好理解面向对象的编程,其次ruby的开发效率也很高。ruby在国内不常用的原因是因为ruby在国际上没有大厂商的支持,所以在国内一般就不怎么用,但是还有很多网站使用ruby开发的。总之,学习不同语言都能帮助自己更好的理解编程。这不是前端必须的,学有余力可以去学习。

5、Java语言

Java是一门面向对象的编程语言,在电子商务领域以及网站开发领域占据了重要的地位。之所以把它列为Web前端开发语言之一,是因为开发人员可以运用很多不同的框架来创建Web项目,如SpringMVC,Struts20以及frameworks等,即使是简单的servlet、jsp和以struts为基础的网站在政府项目中也经常被用到,疗救护、保险、教育、国防以及其他的不同部门网站也都是以Java为基础来开发的。

6、Python

Python是一种解释型的脚本语言,它非常适合用来做Web开发。它的优势也是显而易见的,比如开发效率高,有上百种Web开发框架,有很多成熟的模板技术,如Django、flask等,选择Python开发Web应用。不但开发效率高,而且运行速度快。

总结一下,Web前端开发语言主要就是以上这些,关于他们各自的优势相信大家已经基本了解了。我介绍了这么多的语言,大家都掌握其中多少语言呢?当然了,学习在精不在多,只要熟练掌握一两门,就能大大提高Web前端开发能力。

那个我是用ug编程,我也知道做模板,但是那样不快

我建议你尝试这样

1你先新建个空白图档,用这个图档写几个自己常用的刀路,设好参数。不用生成

2当你开始编程的时候,调到加工

插入操作的时候点浏览,然后选你新建的那个文档,这样里面的刀路就有设好的常用参数

这个方法不用模板来的可靠

因为有时候用模板的程序要出错的

gesp考级:五级以下很简单,考了用处不大,对小升初的孩子来说,五至七级含金量高,比较有用。

编程简介

编程是编定程序的中文简称,就是让计算机代码解决某个问题,对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程。

为了使计算机能够理解人的意图,人类就必须将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算体系之间交流的过程就是编程。

编程:设计具备逻辑流动作用的一种“可控体系”注:编程不一定是针对计算机程序而言的,针对具备逻辑计算力的体系,都可以算编程。

执行原理

计算机对除机器语言以外的源程序不能直接识别、理解和执行,都必须通过某种方式转换为计算机能够直接执行的。

这种将高级程序设计语言编写的源程序转换到机器目标程序的方式有两种:解释方式和编译方式。

1、解释方式

计算机对高级语言书写的源程序一边解释一边执行,不能形成目标文件和执行文件。

2、编译方式

首先通过一个对应于所用程序设计语言的编译程序对源程序进行处理,经过对源程序的词法分析、语法分析、语意分析、代码生成和代码优化等阶段将所处理的源程序转换为用二进制代码表示的目标程序。

然后通过连接程序处理将程序中所用的函数调用、系统功能调用等嵌入到目标程序中,构成一个可以连续执行的二进制执行文件。调用这个执行文件就可以实现程序员在对应源程序文件中所指定的相应功能。

看不太清楚,但是如果是光产生的阴影,无非就是两种办法,一个是找到出现阴影的层,打开质感选项,对着投射阴影选择关闭。另一种就是找到产生阴影的层,打开质感选项,对着接受阴影选择关闭,即可。如果是自制的阴影,直接删了就可以

还有一个,呵呵,修改灯光属性,对投射阴影不打勾

欢迎分享,转载请注明来源:浪漫分享网

原文地址:https://hunlipic.com/langman/3200023.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-08-13
下一篇2023-08-13

发表评论

登录后才能评论

评论列表(0条)

    保存