https://www.cnblogs.com/liangliangh/p/4219879.html

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


简单来说,就四个大志:操纵类型。

虽然从形式上说,值也是类型。在Lambda Calculus中可以用表示值,在Lisp中可以用表示值。一个苹果是一,一个梨也是一。但是在C++中,值是受到歧视的。最简单的,我们不能用值重载。我们只能用劣质标签来匹配。但是我们可以用值来做模板参数(这是C++模板最重要的特性之一)。所以我们有Int Wrapper,用模板来把int包起来,这样我们就可以像使用类型一样使用值了。

关于操纵类型,最容易想到的就是type traits。什么两个类型能不能转换,在类型前面加减cv,加减指针加减引用,这都是最基本的类型的操作(这里有很多SFINAE的应用,但是SFINAE只是C++模板规则的一小部分,还不足以和模板元相提并论)。其实:

template <Template-Args>
struct Function
{using Type = ...;
};

这就是一个接受类型(Template-Args)并返回类型(Type)的函数啊!在模板元编程中我们称呼这个东西为“元函数”。理解元函数就基本上理解模板元编程要干什么了。你有可能觉得模板元编程很弱欸,就这么个东西能图灵完备?当然了,因为我们还有偏特化(分支语句)和递归(循环语句),我们可以随意自如的处理类型。说到这,你还是不服,就几个破类型,YourClass,int,double,Int<N>,你还能给我玩出花来?

还真能。因为我们有这个:

template <typename A, typename B>
struct Cons
{using Car = A;using Cdr = B;
};

我们可以Cons<A, Cons<B, Cons<...>>>无穷无尽也。有了Cons,就有了一切。二生三,三生万物。Cons就是二,那二怎么生三呢?简单:

template <typename K, typename L, typename R>
using TreeNode = Cons<K, Cons<L, R>>;

有了线性结构、树状结构,有了偏特化、递归,我们为所欲为。

有了这些基础,我们再来体会一下高级的类型操纵。最简单的就是量纲分析了,量纲分析是《模板元编程》的开篇例子。模板元编程还有很多应用场景。所有你需要存储、操纵、搜索类型的地方,都是模板元编程的用武之地。

我们用一个例子结尾。假如我们需要做类型的映射,我们还需要用这些类型构造出对象。那么我们可以构造一颗编译期的平衡搜索树,存储这些(接收类型:返回类型)的映射。我们可以很方便地查找、获取、使用类型。如果你用一个哈希表存储类型名字的string的话,且不说效率低下的问题,查找获取类型当然也是可以的,但是得到的只是类型名字的string,如何使用这个类型呢?反射?很麻烦吧。

C++ 模板元编程的应用有哪些,意义是什么?相关推荐

  1. 模板元编程实现素数判定

    模板元编程(英语:Template metaprogramming:缩写:TMP)是一种元编程技术,不夸张的说,这项技术开启了一种新的C++编程方式.编译器使用模板产生暂时性的源码,然后再和剩下的源码 ...

  2. 编程实现算术表达式求值_用魔法打败魔法:C++模板元编程实现的scheme元循环求值器...

    本文使用 Zhihu On VSCode 创作并发布 [TOC] 前言 寒假时沉迷C++模板元编程,写了个简单的Scheme元循环求值器.可以用类似Scheme的语法写出这样的C++模板代码: _&l ...

  3. C++用模板元编程进行循环展开的性能测试

    在网上看到一篇C++模板元编程的文章,里面提到可以用来做循环展开,文章地址如下: https://www.2cto.com/kf/20120... 然后在VS2015里测了一下,测试代码如下: tem ...

  4. C++模板元编程 入门简介

    最近一直在看STL和Boost,源码里边好多涉及到模板元编程技术,简单了解一下,备忘(Boost Python中的涉及模板元的部分重点关注一下). 范例引入 // 主模板 template<in ...

  5. xpath里面if判断一个值不为空_现代C++之模板元编程(今天写个If与While)

    现代C++之模板元编程(今天写个If与While) 0.导语 今天就放轻松,有可能代码写的看的很晦涩,自己多敲几遍即可,下面来进入正文,如何使用模板元编程实现IF与WHILE. 1.IF实现 我们想要 ...

  6. 现代C++模板元编程基础

    元函数的基础介绍 C++的模板元编程是函数式编程,所以函数是一等公民.一切在编译期间执行的函数都可以称为元函数.元函数有struct和constexpr两种定义方式,前者是一直使用的,后者是C++11 ...

  7. C++ 模板元编程简介

    文章目录 1.概述 2.模板元编程的作用 3.模板元编程的组成要素 4.模板元编程的控制逻辑 4.1 if 判断 4.2 循环展开 4.3 switch/case 分支 5.特性.策略与标签 6.小结 ...

  8. 跟我学c++高级篇——模板元编程之十一鸭子类型

    一.鸭子类型 鸭子类型不是从c++中出现的,duck typing这种称呼在Python中比较多见.那么什么是鸭子类型呢?它是动态类型的一种风格,只要是对象的特征(其方法和属性集)和某个类型一致,就认 ...

  9. 数据字典模板_C++ 模板元编程:一种屠龙之技

    概述 模板元编程可在编译时完成一些计算,说它是屠龙之技,是因为模板元编程 似乎很厉害的样子. 似乎没有地方可以用上. 假如只从实际工程出发,没有太大必要研究模板元编程.只是我还是想写写这个主题,感叹一 ...

最新文章

  1. 降维处理:PCA和LDA
  2. vs显示不是有效的window32_玩转“黑科技”,这才是选购“户外显示屏”的正确方式!...
  3. SAP PM信息系统
  4. C# 从不是创建控件 的线程访问它
  5. 判别两棵树是否相等 设计算法_从匈牙利算法到KM算法
  6. Oracle密码过期 怎么修改
  7. svn clean up 出错解决方案
  8. java成绩前五名的代码_java 如何选出成绩排前5名的学生呢
  9. C++中实现精度的控制和输出 showpoint<<或者fixed<<setprecision()用法
  10. 云盘上传一直显示服务器出错_百度云盘上传不了文件,显示服务器错误
  11. 【MAPBOX基础功能】12、mapbox点击点位图层高亮指定的点位
  12. 关于小米驱动程序的问题
  13. eleme接口测试01(C#)
  14. 贪吃蛇小游戏(C语言实现简易版)
  15. 惠普服务器修改ilo密码,HP 修改ILO密码
  16. phpstudy mysql恢复数据_MySQL_详解MySQL误操作后怎样进行数据恢复,一、开启binlog。 首先查看binlo - phpStudy...
  17. 实验三 使用CSS3
  18. 如何通过console线缆本地连接网络设备的路由器或交换机进行配置
  19. C#中的MemoryStream
  20. 盘点 | 2023年最值得学的编程语言TOP 5,Python再度夺冠!

热门文章

  1. 蔚来汽车笔试题-20210718
  2. 如何个性化U盘或硬盘图标
  3. 知识图谱基础知识总结
  4. 我国实战攻防演练的发展现状
  5. Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack.
  6. 计算机丢失slimage.dll,slimage.dll
  7. 易课寄在线购课系统开发笔记(二十五)--完成课程详情页面展示相关功能(应用Redis缓存)
  8. 使用IDEA调试Arthas
  9. 南方科技大学计算机 调剂,2020年南方科技大学接受优秀硕士研究生调剂
  10. if-else if语句与多if语句