C++模板编程与宏编程经验谈

C++模板编程与宏编程经验谈

 

         有人说C 与C++的不同主要是因为C++支持模板,不要说区别是面向对象化编程,因为C同样能很好的实现对象化编程,面向对象化其实只是思想,在很多语言中都能实现,区别在于实现的难易程度,模板看似简单,但深入使用后你会发现他是多么强大的工具,即便它使一些简单问题变的更加复杂,因为我们很多人追求着一个模糊的目标,就是希望计算机能帮助我们设计更多的代码,而减轻自己一遍一遍做码农的痛苦,最终我们发现其实我们的目标是元编程,但是在通往元编程的路上我们走了很多弯路,这条弯路就是模板与宏。
 
很多人谈起宏与模板编程都会很模糊的认为他们的本质是相同的,又有些人觉着他们有细微差别,但又感觉不出来他们在那些方面不同,各自使用的领域。
 
下面我根据自己使用经验将他们做一个比较,介绍他们怎样通过自己的努力去实现我们心中的终极目标---元编程。
 

 

元编程目标

模板

总结

代码不同类型元素拼装能力。

只能对类型和常数进行替换,如果要组装代码,只能通过类型和常数作为判断依据,进行代码组装,因此我们不得不将目标抽象成一个一个小的代码片段封装成类型,然后再组装,但是组装程序缺乏好的设计模式,所以即便诞生了boost中的MPL,但总体上却使问题变的很复杂。

不识别代码元素类型,将其一切元素统一认为是文本,以此进行元素替换,所以可对代码中几乎所有非预编译代码元素进行拼装。

宏胜出,灵活强大,简单易用,相对模板来讲不需要学习代码组装拼接设计模式。

模板MPL虽然使代码拼装变的相对容易,但是要想学习掌握这种代码拼装设计模式,却还是挺难的。

代码拼装的元素本身是否可以是未定或者同样是需要被组装的对象,即支持基本组装元素的符号被组装推导,

y=f(x);

x=g(x)

y=f(g(x))

模板类型可以嵌套模板,拼装的元素本身可以是多个组合模板,可约束性递归拼装,在编译期模板可以自动推导出目标,所以基本拼装元素是个可被拼装的变数,因此可以实现代码按照一定规则实现自指设计,从而形成设计代码的语言(MPL)。

宏的元素虽然可以是包含宏且被组装,但是其所有参数必须是定数,也就是说宏的基本拼装元素在宏一开始时就被确定而不能在宏展开期间再次被自指设计,因此不容易形成设计代码的语言。(语言之所以是语言,可推导且可存储动态信息的变量是必需具备的基本能力)

模板胜出,宏不达标。

多维领域设计能力,即分层的领域设计能力,也叫DSL,每个领域只关心自己领域内问题,给上层领域封装接口,使上层领域可以只关心自己邻域内为题。

因为其只能关注类型以及常数的代码拼装,所以   其具有很强的专注性,方法较统一,都是面向对象化编程,所以相对容易描述多维领域的模型抽象,比如通过封装智能指针,可以用较为统一的面向对象化编程思想实现数据库编程,网络编程,各种序列化技术,甚至分布式云计算,并且因为具有变量推断的能力,因此可以形成语言级别的代码组装语言(MPL)

因为宏组装代码的类型不专注,灵活性很大,所以没有形成统一的编程模式,且因为其基本组装元素不容易被变量化的再次被设计,因此相对模板技术较难形成合理统一的多维领域设计

模板可作为实现DSL的关键技术,宏可以作为辅助技术加快DSL的设计。

 

 

上面表格中对比你会发现,这个表格是矛盾的,模板和宏其自身的优势可能成为他们的缺陷,他们的缺陷却也可能成为他们的优势,且应用领域互补,总体而言,模板部分实现了我们元编程的目标但是限制和难度都超乎想象,使得元编程设计成为一种很痛苦的事情。宏也部分达到元编程的目标,但却不能深度上达到能语言级别的去实现元编程设计。
 
所以我一直在思考是不是有可能借鉴模板以及宏实现一个新的元编程语言。
像宏那样,所有类型元素可参与组装,字符串,变量名,运算符,函数名,函数参数列表,逻辑表达式,类型名,类型存储格式,将这些元素都可以参与组装。
像模板一样,所有参与代码组装的元素都是可被再替换设计的变量,在代码生成过程中被计算,被合成。
像C语言语法一样能够逻辑清晰合理像个程序一样有输入有输出目标一样的执行。
然后再加入智能模板设计思路,可以识别目标代码,将其元素提取出来,可操作,自动化设计出好用的模板。
希望大家参与一同讨论分享自己的经验。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AthlonxpX86

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值