二进制运算符的最佳命名空间是什么

What is the best namespace for a binary operator?

本文关键字:命名空间 是什么 最佳 运算符 二进制      更新时间:2023-10-16

为了美观起见,封装和利用ADL(参数相关查找(是常见于在函数参数的命名空间内定义函数。

假设我在不同的命名空间中有两个库。有三种情况:1(一种是我控制的库的一部分,另一种是第三方(例如Boost(,或者2(我控制两者,或3(我什么都不控制(只是编写"胶水"代码(。

我有这样的东西,

namespace ns_A{
   struct A{...}; // something that looks like iostream
}
namespace ns_B{
   struct B{...};
}

我想将 B "流式传输"到 A,最好的选择是什么

namespace ???{ // what is more correct ns_A, or ns_B?
   A& operator<<(A& a, B const& b){...} 
}

还是我应该把它放在两个命名空间中?

namespace ns_B{
   A& operator<<(A& a, B const& b){...} 
}
namespace ns_A{
   using ns_B::operator<<;
}

定义这样的二进制函数的最佳命名空间是什么?

(C++11 的命名空间内联是否会更改任何建议?

(我operator<<使用这个例子,因为在其他条件相同的情况下,直觉上似乎更喜欢namespace ns_B


编辑:这是我能找到的关于命名空间实际使用的最完整的指南和参考https://www.google.com/amp/s/akrzemi1.wordpress.com/2016/01/16/a-customizable-framework/amp/

在情况 1 中,这很简单:将其放入您控制的namespace中。

在情况 2 中,这取决于您的选择:任何看起来更合乎逻辑的内容。在您的示例中,我更喜欢ns_B.

唯一棘手的情况是 3。您真的不应该添加到任何一个namespace.如果您希望新的"胶水"功能作为您自己的第三namespace mine的一部分,那么自然地将其放在那里,mine中对该功能的任何使用都将自动解决。当然,这不会调用 ADL,但没有必要,因为您想要的只是在 mine 中使用新功能,而不是其他地方。

您可以将运算符放在任一命名空间中,它将起作用。最佳做法是将其放在属于代码的命名空间中。

我的建议:不要使用任何命名空间。ns_A中的代码本身并不知道ns_A中存在任何东西 - 它不依赖于它;因此,有关ns_Bns_A结构的代码不属于ns_Ans_B对称也是如此。

您的operator<<应该位于ns_Ans_B中的"最不常见的命名空间"中,这可能不是命名空间(但如果ns_A ns1::ns2并且ns_Bns1::ns3则使用ns1(。

在我看来,将代码强制到它不明确所属的命名空间中并不优雅,并且在概念上破坏了封装。至于 ADL,我认为您不应该期望超过 ns_Ans_B 的"最不常见的命名空间"给您的东西。