二元运算符的最佳命名空间是什么?

alf*_*lfC 10 c++ argument-dependent-lookup c++11

为了优雅,封装和利用ADL(Argument Dependent Lookup)在函数参数的命名空间内定义一个函数是很常见的.

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

我有这样的事情,

namespace ns_A{
   struct A{...}; // something that looks like iostream
}
namespace ns_B{
   struct B{...};
}
Run Code Online (Sandbox Code Playgroud)

我想将"流"B流入A,最佳选择是什么

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

或者我应该把它放在两个名称空间中?

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

哪个是定义像这样的二进制函数的最佳命名空间?

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

(我使用这个例子operator<<是因为,在其他条件相同的情况下,直觉上看起来更好namespace ns_B.)


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

Wal*_*ter 5

在案例1中,很容易:把它放在namespace你控制的地方.

在案例2中,这取决于您的选择:看起来更合乎逻辑.在您的示例中,我更喜欢ns_B.

唯一棘手的情况是3.你不应该添加任何一个namespace.如果您希望将新的"胶水"功能作为您自己的第三个功能的一部分namespace mine,那么自然会将其放入其中,并且mine将自动解决对该功能的任何使用.当然,这不会占用ADL,但不需要它,因为您只需要使用内部的新功能mine,而不是其他地方.


Sim*_*ple 4

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