C++ 模板编程中的多态性、特性与策略类
1. STL 与多态性
STL 通过迭代器对操作进行参数化,避免了操作定义数量的爆炸式增长。只需实现一次算法,就能用于所有容器,迭代器作为容器和算法之间的通用粘合剂,具有特定接口,这个接口被称为概念,它表示模板必须满足的一组约束。
从原理上讲,类似 STL 的功能可以通过动态多态实现,但实际上,由于迭代器概念相较于虚函数调用机制过于轻量级,添加基于虚函数的接口层可能会使操作速度大幅下降。而泛型编程依赖静态多态,在编译时解析接口,这使得它切实可行。不过,这也需要不同于面向对象设计原则的新设计原则。
在容器类型方面,模板引入 C++ 之前,多态层次结构是处理容器的流行方法,例如 NIHCL,它在很大程度上借鉴了 Smalltalk 的容器类层次结构。NIHCL 支持多种容器和迭代器,采用动态多态实现,但运行时间和内存使用成本较高,因为大多数操作需要虚调用,且内置类型需要包装在更大的多态类中。
动态多态在某些情况下是正确的选择,例如异构迭代;而许多编程任务使用模板自然且高效,例如同质容器。静态多态适用于基本计算结构,而动态多态库通常需要进行特定领域的选择。C++ 标准库的 STL 部分不包含多态容器,但有丰富的使用静态多态的容器和迭代器。
中大型 C++ 程序通常需要处理静态和动态两种多态性,有时甚至需要紧密结合它们。在很多情况下,根据讨论结果,最优设计选择是明确的,但花时间考虑长期潜在的演变通常是值得的。
2. 特性与策略类
模板使我们能够为各种类型对类和函数进行参数化,但引入过多模板参数会使客户端代码指定参数变得繁琐。幸运的是,大多数额外参数有合理的默认值,
超级会员免费看
订阅专栏 解锁全文
1339

被折叠的 条评论
为什么被折叠?



