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所指出的那样)再说一遍:这不是特定的提升.
std::swap()免费功能std::begin()并std::end()作为自由函数std::hash<>,std::less<>,std::greater<>,std::equal_to<>类似地提供定制点不属于侵入式的(但不是功能当然)