繁体   English   中英

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

[英]Why does boost recommend using core functions over member functions?

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

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

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

它本身并不是提升,而是现代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 

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM