在boost.geometry的文档中,它指出
注意:更喜欢使用 x = bg::get :<0>(point1);
(相对于 x = point1.get<0>();)
我在 boost 文档的其他地方看到了这一点。我的问题是为什么?这是一个最佳实践的东西,一个性能的东西还是一些怪癖?这是该库的一般规则还是特定于该库?
在boost.geometry的文档中,它指出
注意:更喜欢使用 x = bg::get :<0>(point1);
(相对于 x = point1.get<0>();)
我在 boost 文档的其他地方看到了这一点。我的问题是为什么?这是一个最佳实践的东西,一个性能的东西还是一些怪癖?这是该库的一般规则还是特定于该库?
它本身不是提升,而是现代 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<>
类似地提供非侵入性的自定义点(但当然不是函数)