为什么Boost建议在成员功能上使用核心功能
Why does boost recommend using core functions over member functions?
在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 当然)
- C 03具有
相关文章:
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 在c++中初始化矩阵时出现分段错误(核心转储)
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- MPI突然停止了对多个核心的操作
- 在多个核心中处理一个HTTP请求
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 运算符继承和 cpp 核心准则 c.128 的问题
- 浮点异常(核心转储)#694457
- 分段错误(核心转储)但无法弄清楚
- 链接到libkcapi时没有核心转储
- 检测到堆栈粉碎:已终止 中止(核心已转储)
- 分段错误(核心转储) - 使用 SavedModel 的 Tensorflow C++ API 进行推断
- 我不知道为什么这段代码会让核心被转储?
- 比特币核心libbitcoin_server_a-httpserver.o 错误
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- C++指针无法在函数外部传递值和分段错误(核心转储)错误
- 合并排序:分段错误核心转储