为什么Boost建议在成员功能上使用核心功能

Why does boost recommend using core functions over member functions?

本文关键字:核心 心功能 功能上 成员 Boost 为什么      更新时间:2023-10-16

在boost的文档中,几何

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

我在Boost文档中的其他地方看到了这一点。我的问题是为什么?这是最佳实践的事情,表演还是一些怪癖?是该库的一般规则还是特定的?

它本身不是增强,而是现代C API设计。

  • 不需要成员功能,您可以调整自己的课程,甚至可以调整第三方库类型来与您选择的Boost API一起使用。(这样您就可以从第三方库中制作类型,可序列化序列化存档)。

  • 另外,通过制作无函数的功能,可以改善依赖关系的脱钩。例如:fusion/tuple.hpp不需要依赖与IO相关的任何内容,因为流操作是免费功能,因此可以在单独的标题中声明(并定义):fusion/tuple_io.hpp

  • 它也有助于封装,因为默认情况下,免费功能不是主机类的friend s(因此无法访问私有成员)。

  • 免费功能可以基于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<>类似地提供自定义点 不是侵入性的(但不是 functions 当然)