我最近介绍了通用编程库的设计,如 STL、boost::graph、boost PropertyMaps http://www.boost.org/doc/libs/1_54_0/libs/property_map/doc/property_map.html
使用像 get(PropertyMap, key) 这样的自由函数而不是像 PropertyMap.get(key) 这样的成员函数背后的基本原理是什么?
据我了解,这些函数的最通用形式是在“boost”命名空间中定义的。假设我在命名空间“project”中定义了一个新的 PropertyMap,定义它对应的“get”函数的最佳位置是什么? “boost ”或“项目”
最佳答案
有两个不同的原因:
更好的封装:通过最大限度地减少可以访问类属性的函数的数量,您可以改进封装。
可扩展性:在 C++ 中,命名空间定义是开放的(您可以向其中添加),而类定义是封闭的;因此您可以添加自由函数,但不能添加成员函数。
虽然封装更像是一个品味问题,但可扩展性在泛型编程中极为重要。您不希望仅仅因为第 3 方类型缺少您需要的一种方法而不得不放弃它……当然,某些类型(例如内置类型或标准库类型)根本无法扩展。
关于c++ - 为什么泛型编程设计更喜欢自由函数而不是成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17705228/