泛型编程:源起、实现与意义

 

泛型编程:源起、实现与意义
 
By 刘未鹏
C++ 的罗浮宫 (http://blog.csdn.net/pongba)
( 去年 12 月《程序员》的约稿 )
( 以前也写过一篇相关的文章: Generic Programming - What Are You, anyway? )
 
为什么泛型
泛型编程( Generic Programming )最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库。所谓通用的标准容器库,就是要能够做到,比如用一个 List 类存放所有可能类型的对象 , 这样的事情;熟悉一些其它面向对象的语言的人应该知道,如 Java 里面这是通过在 List 里面存放 Object 引用来实现的。 Java 的单根继承在这里起到了关键的作用。然而单根继承对 C++ 这样的处在语言链底层的语言却是不能承受之重。此外使用单根继承来实现通用容器也会带来效率和类型安全方面的问题,两者都与 C++ 的理念不相吻合。
 
于是 C++ 另谋他法——除了单根继承之外,另一个实现通用容器的方案就是使用“参数化类型”。一个容器需要能够存放任何类型的对象,那干脆就把这个对象的类型“抽”出来,参数化它 [1]
 
template<class T> class vector {
 T* v;
 int sz;
public:
 vector(int);
 T& operator[](int);
 T& elem(int i) { return v[i]; }
 // ...
};
 
一般来说看到这个定义的时候,每个人都会想到 C 的宏。的确,模板和宏在精神上的确有相仿之处。而且的确,也有人使用 C 的宏来实现通用容器。模板是将一个定义里面的类型参数化出来,而宏也可以做到参数化类型。甚至某种意义上可以说宏是模板的超集——因为宏不仅可以参数化类型,宏实质上可以参数化一切文本,因为它本来就是一个文本替换工具。然而,跟模板相比,宏的最大的缺点就是它并不工作在 C++ 的语法解析层面,宏是由预处理器来处理的,而在预处理器的眼里没有 C++ ,只有一堆文本,因此 C++ 的类型检查根本不起作用。比如上面的定义如果用宏来实现,那么就算你传进去的 T 不是一个类型,预处理器也不会报错;只有等到文本替换完了,到 C++ 编译器工作的时候才会发现一堆莫名其妙的类型错误,但那个时候错误就已经到处都是了。往往最后会抛出一堆吓人的编译错误。更何况宏基本无法调试。
 
1
实际上,还有一种实现通用容器的办法。只不过它更糟糕:它要求任何能存放在容器内的类型都继承自一个NodeBase,NodeBase里面有pre和next指针,通过这种方式,就可以将任意类型链入一个链表内了。但这种方式的致命缺点是(1)它是侵入性的,每个能够放在该容器内的类型都必须继承自NodeBase基类。(2)它不支持基本内建类型(int、double等),因为内建类型并不,也不能继承自NodeBase。这还姑且不说它是类型不安全的,以及效率问题。
 
我们再来看一看通用算法,这是泛型的另一个动机。比如我们熟悉的 C qsort
 
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
 
这个算法有如下几个问题:
 
1.      类型安全性:使用者必须自行保证 base 指向的数组的元素类型和 compar 的两个参数的类型是一致的;使用者必须自行保证 size 必须是数组元素类型的大小。
2.      通用性: qsort 对参数数组的二进制接口有严格要求——它必须是一个内存连续的数组。如果你实现了一个巧妙的、分段连续的自定义数组,就没法使用 qsort 了。
3.      接口直观性:如果你有一个数组 char* arr = new arr[10]; 那么该数组的元素类型其实就已经“透露”了它自己的大小。然而 qsort 把数组的元素类型给“ void ”掉了( void *base ),于是丢失掉了这一信息,而只能让调用方手动提供一个 size 。为什么要把数组类型声明为 void* ?因为除此之外别无它法,声明为任意一个类型的指针都不妥(
  • 7
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
### 回答1: CSDN是一个技术社区,涵盖了各种技术领域,包括WiFi技术。虽然CSDN上有很多与WiFi相关的文章和教程,但是关于WiFi的专门书籍相对较少。以下是一些与WiFi相关的书籍或资源,你可以参考: 1. 《WiFi技术与应用》:这本书介绍了WiFi的基本原理、无线网络的搭建和维护、WiFi热点的实现等内容,适合初学者入门。 2. 《WiFi技术与5G融合发展》:本书主要讲解了WiFi技术在5G网络中的应用和发展,介绍了WiFi 6标准、热点技术、安全和性能优化等内容。 3. 《无线网络技术与应用》:这本书从基础的无线通信协议开始介绍,包括WiFi、蓝牙、Zigbee等无线技术,并涵盖无线通信中的安全性、网络规划、性能优化等方面。 4. 《Wi-Fi性能优化》:本书主要介绍了如何通过优化WiFi网络来提高性能和覆盖范围,包括信道选择、天线设计、信号干扰处理、路径选择等优化方法。 此外,你也可以在CSDN上搜索关于WiFi的专栏或博客文章,这些资源更加实时,并提供了更多实践经验和技术分享。总之,除了书籍外,CSDN是一个了解和学习WiFi技术的好地方。 ### 回答2: 关于WiFi的相关书籍,我推荐阅读CSND出版社出版的几本经典著作。 首先是《WiFi技术详解与实战》,这本书主要介绍了WiFi技术的原理、标准和实战应用。通过对无线网络基本概念的阐述和实际案例的分析,读者可以从中了解到WiFi网络的运作原理,学习到如何设计、部署和管理一个可靠的无线网络。 其次是《WiFi无线网络技术与应用实战》,该书着重介绍了WiFi技术在实际应用中的各个方面。从网络覆盖、网络安全、网络性能等多个角度出发,详细介绍了如何优化和提升WiFi网络的性能与稳定性,并解决在实际应用中可能遇到的问题。 还有一本是《WiFi无线网络原理与应用》,这本书主要介绍了无线通信和无线网络的基本原理,以及WiFi技术的发展和应用。通过对WiFi技术的源起、发展历程和应用案例进行讲解,读者可以深入了解WiFi技术在现代通信领域中的重要作用,了解到WiFi的应用前景。 总的来说,通过阅读这几本CSND出版的WiFi相关书籍,读者可以全面了解WiFi技术的基本原理、标准和实践应用,从而能够在实际工作中更好地应对无线网络的设计、部署和管理。这些书籍不仅适合网络工程师、无线通信从业人员阅读,对于对WiFi技术感兴趣的读者也是一本不错的选择。 ### 回答3: 在CSDN(中国软件开发者社区)里,有一些与Wi-Fi相关的书籍可以供读者参考和学习。以下是其中一些比较受欢迎的书籍: 1.《Wi-Fi 热点安全技术与实践》:这本书详细介绍了Wi-Fi热点的安全技术和实践方法。它包含了Wi-Fi热点的原理、无线网络安全漏洞、黑客攻击手法以及Wi-Fi安全增强措施等内容,非常适合安全从业人员和网络管理员阅读。 2.《Wi-Fi技术详解与实战》:本书全面介绍了Wi-Fi技术的基础知识,包括无线局域网的原理、标准、设备和协议等。同时,它还介绍了Wi-Fi的应用场景,并通过实战案例来展示Wi-Fi网络规划、部署和故障排除等技术。 3.《Wi-Fi无线局域网技术与应用》:这本书对Wi-Fi无线局域网的基本概念、技术原理和应用进行了介绍。它涵盖了无线网络的构建、无线接入技术、频谱资源管理以及Wi-Fi网络性能优化等内容,适合对Wi-Fi感兴趣的读者。 4.《Wi-Fi技术与应用》:该书详细了解了Wi-Fi无线局域网的技术原理、标准、部署和维护等内容,并通过案例分析和实践操作来加深理解。不仅适用于网络技术人员和系统管理员,还对对Wi-Fi无线局域网有兴趣的读者有很大帮助。 除了这些书籍,CSDN上还有许多技术文章和博客,提供了大量关于Wi-Fi网络的优化、故障排除、安全性方面的教程和指南。读者可以在CSDN的搜索栏中输入关键词“Wi-Fi”进行查找,获得更多相关的资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值