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

简介: C++模板编程与宏编程经验谈          有人说C 与C++的不同主要是因为C++支持模板,不要说区别是面向对象化编程,因为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
0
2
分享
相关文章
4步实现C++插件化编程,轻松实现功能定制与扩展(2)
本文是《4步实现C++插件化编程》的延伸,重点介绍了新增的插件“热拔插”功能。通过`inotify`接口监控指定路径下的文件变动,结合`epoll`实现非阻塞监听,动态加载或卸载插件。核心设计包括`SprDirWatch`工具类封装`inotify`,以及`PluginManager`管理插件生命周期。验证部分展示了插件加载与卸载的日志及模块状态,确保功能稳定可靠。优化过程中解决了动态链接库句柄泄露问题,强调了采纳用户建议的重要性。
46 5
4步实现C++插件化编程,轻松实现功能定制与扩展(2)
模板(C++)
本内容主要讲解了C++中的函数模板与类模板。函数模板是一个与类型无关的函数家族,使用时根据实参类型生成特定版本,其定义可用`typename`或`class`作为关键字。函数模板实例化分为隐式和显式,前者由编译器推导类型,后者手动指定类型。同时,非模板函数优先于同名模板函数调用,且模板函数不支持自动类型转换。类模板则通过在类名后加`<>`指定类型实例化,生成具体类。最后,语录鼓励大家继续努力,技术不断进步!
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
6月前
|
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
161 10
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
|
2月前
|
【c++】模板详解(2)
本文深入探讨了C++模板的高级特性,包括非类型模板参数、模板特化和模板分离编译。通过具体代码示例,详细讲解了非类型参数的应用场景及其限制,函数模板和类模板的特化方式,以及分离编译时可能出现的链接错误及解决方案。最后总结了模板的优点如提高代码复用性和类型安全,以及缺点如增加编译时间和代码复杂度。通过本文的学习,读者可以进一步加深对C++模板的理解并灵活应用于实际编程中。
36 0
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
803 71
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
目录
目录
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等