为什么boost建议使用核心功能而不是成员函数?

mmd*_*ger 4 c++ boost member non-member-functions

boost.geometry的文档中,它说明了

注意:更喜欢使用x = bg :: get:<0>(point1);
(而不是x = point1.get <0>();)

我在boost docs的其他地方看过这个.我的问题是为什么?这是最好的做法,表演还是一些怪癖?这是一般规则还是特定于此库?

seh*_*ehe 14

它本身并不是提升,而是现代C++ API设计.

  • 通过不要求成员函数,您可以调整自己的类甚至第三方库类型以使用您选择的boost Api.(这样您就可以将类型从第三方库序列化为Boost Serialization存档).

  • 此外,通过使函数自由函数,可以改善依赖关系的解耦.例如:fusion/tuple.hpp不需要依赖任何有关IO,因为流媒体业务是免费的功能,因此可以在一个单独的头声明(和定义)fusion/tuple_io.hpp.

  • 它还有助于封装,因为默认情况下,自由函数不是friend宿主类的(因此无法访问私有成员).

  • 免费功能可以基于ADL"做正确的事":

    using std::swap;
    swap(a, b); // will lookup `swap` in the namespaces that declare the parameter types
    
    Run Code Online (Sandbox Code Playgroud)

    (其他几个名称空间也用于查找)

  • 最后,自由函数可以一般地为一组类型提供服务,这些类型不需要与OO相关(与继承相关).通过这种方式,自由函数可以避免重复代码.

编辑解决为什么您应该更喜欢非成员语法的问题,如果两者都存在:

  • 它适用于没有成员函数的类型
  • 它不需要.template在模板代码中消除歧义(正如@Simple所指出的那样)
  • 再说一遍:这不是特定的提升.

    • c ++ 03具有std::swap()免费功能
    • c ++ 11引入std::begin()std::end()作为自由函数
    • std::hash<>,std::less<>,std::greater<>,std::equal_to<>类似地提供定制点不属于侵入式的(但不是功能当然)