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

时间:2014-01-21 12:19:07

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

boost.geometry的文档中说明了

  

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

我在升级文档的其他地方看到了这一点。我的问题是为什么?这是最好的做法,表演还是一些怪癖?这是一般规则还是特定于此库?

1 个答案:

答案 0 :(得分:14)

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

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

  • 此外,通过使函数自由函数,可以改善依赖关系的解耦。例如: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
    

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

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

修改解决为什么您应该选择非成员语法的问题,如果两者都存在

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

    • c ++ 03已将std::swap()作为自由函数
    • c ++ 11引入std::begin()std::end()作为自由函数
    • std::hash<>std::less<>std::greater<>std::equal_to<>同样提供非侵入性的自定义点(但不是函数当然)