4

boost.geometry的文档中,它指出

注意:更喜欢使用 x = bg::get :<0>(point1);
(相对于 x = point1.get<0>();)

我在 boost 文档的其他地方看到了这一点。我的问题是为什么?这是一个最佳实践的东西,一个性能的东西还是一些怪癖?这是该库的一般规则还是特定于该库?

4

1 回答 1

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<>类似地提供非侵入性的自定义点(但当然不是函数
于 2014-01-21T12:28:59.970 回答