"Modern C++"为什么采用泛型编程
来源:互联网 发布:阿里云1m带宽慢不慢 编辑:程序博客网 时间:2024/05/22 08:16
正如Biarne Stroustrup指出的那样,“C + +是一种多范型的语言。”它支持不同风格的程序和范例,面向对象的编程只是其中之一,还有结构化编程和泛型编程。在过去几年c++方面专家Andrei Alexandrescu ,Scott Meyers和Herb Sutter推荐用户使用泛型编程,他们将它成为现代c++设计。
关于现代C++设计,Andrei Alexandrescu这样说:
现代c++设计定义并系统地使用通用组件——高度灵活的设计品是少量的orthogonal body of code和丰富的行为的融合和匹配。
他的观点提出如下三点
- 现代C++设计定义并系统地使用通用组件。
- 高灵活度
- 使用少量orthogonal body of code得到丰富的行为。
泛型的灵活性
为了更加清楚的了解泛型的灵活性,下面比较一下在OOP和泛型中税收计算类的实现。
OOP 实现:
CTaxCalculator类能告诉我们什么?
我是CTaxCalculator类,我知道如何计算税收,但我只与ICalculator类型的类协作。我拒绝与任何其他任何非 ICalculator类合作,即使它可以帮我计算税。
泛型实现:
CGenericTacCalculator类知道如何计算税收,并且能够和任何类型合作进行税收计算。
这使得泛型编程更自然的和灵活,第一种方法就想是在现实世界中,一个公司只接受一个从特定学校毕业的开发人员,拒绝其他人即使他们有相应的技术。
但代码变得灵活的代价是变得难以理解。事实上在OOP中我可以直接去看ICalculator类的定义,就可以知道我们我们能从这个类型中获得什么。而在泛型编程中我们很难确切知道能从参数模板中得到什么,哪些参数是必须包含的?是否必须来自一个特定的类型?
的确C++特性和SFINAE机制能帮助我们定义从模板参数中得到什么,但这项先进的特性是很少C++开发者掌握的。
c++设计师们意识到这个问题,并在新的C++标准中,添加了许多模板编程的改进。大家能看到非常有趣“Concept-lite”特性,它用来定义参数模板的限制。
泛型编程产生的代码更加简洁
拷贝代码使得维护变得困难,而且可能产生各种错误。使用泛型编程可以避免有害的重复。
第二个小例子:计算两个数字之和。
下面是不使用模板完成的代码:
使用模板函数,代码变得更加简洁:
这只是展示使用模板获得简洁代码的一个小例子,STL和boost包含更高级的算法,使得泛型编程个更加强大能够取代boilerplate code。
但是为什么泛型编程没有得到广泛的使用?
泛型编程听起来更加自然和灵活,它可以提供比OOP更多的用法,然而许多开发人员发现它非常复杂,很难学习和使用。
- 代码变得不清晰,更难维护。
- 编译错误更难懂。
如果你看一下知名的C++开源设计,就会知道,泛型编程大部分只用在C++库里,像stl,boost,loki和folly,但是很少有使用反省编程的应用,虽然他们大部分都用了模板库。
总结
现代C++设计更倾向于强大的泛型编程方法,但是在使用之前你可能需要花费很大代价去学习。感谢Andrei Alexandrescu, Scott Meyers,Herb Sutter等人的努力让泛型编程更好理解,并简化了其应用。但是现代C++设计还没有被C++社区广泛使用。
- "Modern C++"为什么采用泛型编程
- modern c 8.1 编程题
- 为什么采用C/S体系结构
- Modern Objective-C
- Modern Objective-C
- Modern Objective-C
- Adopting Modern Objective-C
- Adopting Modern Objective-C
- Adopting Modern Objective-C
- 《Effective Modern C++》读书笔记
- Effective Modern C++(笔记)
- 为什么还用C编程?
- 读-《c++设计新思维-泛型编程与设计模式之应用》经典记录(英文书名:《modern c++ design》)
- 《Effective Modern C++》翻译--简介
- Modern C++(三)decltype关键字
- Modern C++(五)nullptr关键字
- 为什么采用SOA?
- 计算机为什么采用二进制
- 判断点是否在多边形内(包括在多边形上)的一个算法
- Apache 多路复用模块(MPMs) - Prefork, Worker, Event
- Java中获取键盘输入值的三种方法
- 计算矩阵边缘元素之和
- Understanding Bootstrap Of Oracle Database
- "Modern C++"为什么采用泛型编程
- ubuntu缩短终端路径名称显示
- 关于banana PI代理商深圳市乐美客科技有限公司(lemaker)严重违法行为的严正声明
- 二维数组右上左下遍历
- linux下标准I/O操作
- 比特币高频交易的实战简易版
- Linux的内存使用说明
- (软件工程视频总结)之软件测试
- QT Demo 之 window(2) Splash