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/安培/
在案例1中,很容易:把它放在namespace你控制的地方.
在案例2中,这取决于您的选择:看起来更合乎逻辑.在您的示例中,我更喜欢ns_B.
唯一棘手的情况是3.你不应该添加任何一个namespace.如果您希望将新的"胶水"功能作为您自己的第三个功能的一部分namespace mine,那么自然会将其放入其中,并且mine将自动解决对该功能的任何使用.当然,这不会占用ADL,但不需要它,因为您只需要使用内部的新功能mine,而不是其他地方.