【发布时间】:2016-04-13 01:43:09
【问题描述】:
为了优雅、封装和利用 ADL (Argument Dependent Lookup),通常在函数参数的命名空间内定义函数。
假设我在不同的命名空间中有两个库。有三种情况 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/
【问题讨论】:
-
不要摆弄你无法控制的命名空间。
-
@Walter,显然该建议对 Std 有好处。但显然好的解决方案实际上会摆弄其他人的命名空间google.com/amp/s/akrzemi1.wordpress.com/2016/01/16/…
标签: c++ c++11 argument-dependent-lookup