为了谈应用,先谈谈使命。模板元编程的根在模板。
模板的使命很简单:为自动代码生成提供方便。提高程序员生产率的一个非常有效的方法就是“代码复用”,而面向对象很重要的一个贡献就是通过内部紧耦合和外部松耦合将“思想”转化成一个一个容易复用的“概念”。但是面向对象提供的工具箱里面所包含的继承,组合与多态并不能完全满足实际编程中对于代码复用的全部要求,于是模板就应运而生了。
模板是更智能的宏。模板和宏都是编译前代码生成,像宏一样,模板代码会被编译器在编译的第一阶段(在内部转,这点儿与预编译器不同)就展开成合法的C++代码,然后根据展开的代码生成目标代码,链接到最终的应用程序之中。模板与宏相比,它站在更高的抽象层上面,宏操作的是字符串中的token,然而模板却能够操作C++中的类型。所以模板更加安全(因为有类型检查),更加智能(可以根据上下文自动特化)……
说完模板,来说说模板元编程:
模板元编程其实就是复杂点儿的模板,简单的模板在特化时基本只包含类型的查找与替换,这种模板可以看作是“类型安全的宏”。而模板元编程就是将一些通常编程时才有的概念比如:递归,分支等加入到模板特化过程中的模板,但其实说白了还是模板,自动代码生成而已。
说完使命,来看看应用:编译时计算,补充类型系统,Domain Specific Language(是你说的“开发新语言”么?)
编译时计算,比如拿模板来计算菲波纳切数列。优点是不占用运行时的CPU时间。但是这事儿吧,我觉得不该拿模板来搞,哪怕你拿python算好了再贴到C++文件里面,都比用模板好一点儿吧……还好C++11好像改了改这里,以后这种需求应该可以用constexpr来搞定了,那样会更好。
补充类型系统,比如boost还是哪个的文档里面举的物理量计算的量纲问题。这个我觉得是非常有意义的,也是最有实用价值的。模板提供了参数化的类型,给我们一种来补充C++自带的类型系统的方法,使得类型系统更加智能与完备,很强大。
DSL,我觉得用C++搞DSL不太好吧,有其它语言对DSL提供更易用的支持呀,比如scala, Haskell, Lisp……天涯何处无芳草,何必非跟C艹搞(我明明是C++脑残粉呀,似乎不能这么说吧,罪过罪过)……
模板元编程缺点也是显而易见的,有人说它是C++里面的函数式编程语言,我觉得也有道理,维基百科上面说模板是图灵完全的,也就是理论上可以写出任何算法。然后这些信息综合一下儿就是尼玛命令式语言里面藏着一个函数式语言,一个编程语言里面放着另一个编程语言,这尼玛绝对是唯恐天下不乱的节奏呀!
总而言之,这东西真有用,不信你出门问问,现在模板或宏已经成主流语言的标配了。但是这东西真的别乱用,想好了再用,码农何苦为难码农。如果你不觉得它有什么应用,就先别用。它不狭窄,是你还没看开……
作者:旺旺
目前有 1 条留言 访客:0 条, 博主:0 条 ,引用: 1 条
外部的引用: 1 条
- 用vs2017编译zlib源码并完成编译批处理脚本 – 建标科技