在 boost.geometry 的文档中它指出
Note: prefer using x = bg::get:<0>(point1);
(as opposed to x = point1.get<0>();)
我在 boost 文档的其他地方看到过这个。我的问题是为什么?这是最佳实践、性能还是一些怪癖?它是通用规则还是特定于该库?
最佳答案
它本身不是 boost ,而是现代 C++ API 设计。
由于不需要成员函数,您可以调整自己的类甚至第三方库类型以与您选择的 boost Api 一起使用。 (这样您就可以将第三方库中的类型序列化为 Boost 序列化存档)。
此外,通过使函数成为自由函数,可以改善依赖关系的解耦。例如:
fusion/tuple.hpp
不需要依赖任何与 IO 相关的东西,因为流操作是自由函数,因此可以在单独的 header 中声明(和定义):fusion/tuple_io.hpp
.它还有助于封装,因为默认情况下自由函数不是
friend
主机类的 s(因此无法访问私有(private)成员)。自由函数可以基于 ADL“做正确的事”:
using std::swap; swap(a, b); // will lookup `swap` in the namespaces that declare the parameter types
(其他几个命名空间也用于查找)
最后,自由函数通常可以为一组类型提供服务,而无需与 OO 相关(与继承相关)。通过这种方式,自由函数鼓励避免代码重复。
编辑解决为什么您应该更喜欢非成员语法的问题,如果两者都存在:
- 它适用于没有成员函数的类型
- 不需要
.template
模板代码中的消歧(正如@Simple 所指出的) 再次声明:它不是特定于 boost 的。
- c++03 有
std::swap()
作为一项免费功能 - c++11 引入了
std::begin()
和std::end()
作为免费功能 -
std::hash<>
,std::less<>
,std::greater<>
,std::equal_to<>
类似地提供非侵入性的自定义点(当然不是功能)
- c++03 有
关于c++ - 为什么 boost 推荐使用核心函数而不是成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21257964/