c++ - 为什么 boost 推荐使用核心函数而不是成员函数?

标签 c++ boost member non-member-functions

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++ - 为什么 boost 推荐使用核心函数而不是成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21257964/

相关文章:

C++ 保护的变量不被继承

c++ - 通过未排序的列表改进搜索

c++ - 错误 : invalid declarator before ‘&’ token

c++ - 将 UINT32 值转换为 UINT8 数组[4]

c++ - 我怎样才能 std::sqrt(boost::lambda::placeholder1_type)?

C++回调系统。指向成员函数的指针

c++ - createsamples OpenCV 后没有 .vec 文件 - Haar Training

c++ - 有效地在 Boost BGL 图中找到所有可达的顶点

macos - Clang 增加了奇怪的东西

C++从公共(public)静态方法访问私有(private)静态成员?