c++ - 为什么泛型编程设计更喜欢自由函数而不是成员函数?

标签 c++ generics boost

我最近介绍了通用编程库的设计,如 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/

相关文章:

c++ - 如何使用新版本的Node Nan Persistent

c++ - 自定义类/对象的构造函数和初始化

c++ - 是否可以为模板类的成员函数编写特化?

generics - 了解 F# 内联和静态解析类型参数 : F# casting example

c# 泛型重载方法分派(dispatch)不明确

c++ - 这个 boost::tuple 代码可以转换为纯 std::standard 库代码吗?

c++ - 二维点云中没有异常值的最近邻

javascript - 有没有办法在 typescript 中实例化通用文字类型?

c++ - 通用等价于 std 函数对象

c++ - += 在没有 boost 的 vector 上