在boost.geometry的文档中说明了
注意:更喜欢使用x = bg::get:< 0>(point1);
(而不是x = point1.get< 0>();)
我在升级文档的其他地方看到了这一点。我的问题是为什么?这是最好的做法,表演还是一些怪癖?这是一般规则还是特定于此库?
答案 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所指出的那样)再说一遍:这不是具体的提升。
std::swap()
作为自由函数std::begin()
和std::end()
作为自由函数std::hash<>
,std::less<>
,std::greater<>
,std::equal_to<>
同样提供非侵入性的自定义点(但不是函数当然)