二进制运算符的最佳命名空间是什么
What is the best namespace for a binary operator?
为了美观起见,封装和利用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_B
和ns_A
结构的代码不属于ns_A
。ns_B
对称也是如此。
您的operator<<
应该位于ns_A
和ns_B
中的"最不常见的命名空间"中,这可能不是命名空间(但如果ns_A
ns1::ns2
并且ns_B
是ns1::ns3
则使用ns1
(。
在我看来,将代码强制到它不明确所属的命名空间中并不优雅,并且在概念上破坏了封装。至于 ADL,我认为您不应该期望超过 ns_A
和 ns_B
的"最不常见的命名空间"给您的东西。
- 在命名空间名称之前加上 :: 是什么意思?
- 朋友定义函数的名称空间是什么
- 命名空间 Win 没有成员"simpleControl"是什么意思
- 命名空间(是/满足)概念吗?
- 在Visual Studio中生成的匿名命名空间变量的损坏名称的数字部分是什么意思
- 什么是"使用命名空间 std;"的好替代方案?
- 使用 "::member" 引用全局命名空间有什么用吗?
- 合并函数参数的适当命名约定是什么?
- 返回布尔值的函数的命名约定是什么
- 旧样式演员的命名演员是什么:pv =(void*)ps;
- 在 c++ 中在命名空间内定义类的优势是什么
- 什么是“使用命名空间 std;”,为什么我需要它来编译具有最新C++编译器的程序
- 什么是内联命名空间
- 二进制运算符的最佳命名空间是什么
- 在命名空间中定义双常量的最佳方式是什么
- 用于"augments std"的代码的命名空间是什么?
- WinRT中字段的正确命名约定是什么
- 默认名称空间是什么
- "using"命名空间和声明命名空间有什么区别?
- C++命名空间..匿名命名空间是合法的