将命名空间缩小到基础

shrinking namespace to base

有办法"shrink a namespace"吗?

例如

std::chrono::millisecondsstd::milliseconds 仅通过命名空间?

namespace std = std::chrono

(请无视这是在修改std。这只是一个例子,我想大家都能理解)

Is there a way to "shrink a namespace"?

您可以给命名空间一个别名,或者您可以有 using namespace 个声明。

e.g.

std::chrono::milliseconds to std::milliseconds

类似的事情是可能的,但对于 std 命名空间则不行,因为您不能将此类声明放在那里。

但这是可能的,例如:

namespace my {
     using namespace std::chrono;
}

还有这个:

namespace my_chrono = std::chrono;

如果您的命名空间包含一些您想要缩短的深层嵌套名称(并且它是您可以修改的命名空间)。例如:

namespace my {
  namespace deeply {
    namespace nested {
      namespace ns {
 // ...
}}}}

您可以使用命名空间别名来简化它:

namespace my {
  namespace easy = deeply::nested::ns;
}

将您自己的别名添加到 std::chronostd 外部:

namespace chrono = std::chrono;

然后使用chrono::milliseconds.


可以通过添加内部命名空间别名来折叠命名空间层。标准库是这样做的:

namespace std {
    namespace ranges::views { /* views stuff */ }

    namespace views = ranges::views;
}

这样 std::ranges::views::filter 也可以作为 std::views::filter.

访问

但这对这里没有帮助,因为 milliseconds 是一种类型,而不是名称空间。折叠命名空间内容的唯一方法是使用 using 指令(或等效地,大量 using 声明):

namespace std {
    namespace chrono { /* chrono things */ }

    using namespace chrono;
}

这不是一个好主意,因为它可能会破坏对事物的名称查找 - 特别是如果 std::chrono 中的任何内容与 std 中的内容相同。这也完全违背了以嵌套名称空间开头的目的。

所以相当于内部命名空间别名的就是外部命名空间别名:

namespace std {
    namespace chrono { /* chrono things */ }
}
namespace chrono = std::chrono;

现在您可以编写 chrono::milliseconds 而不是 std::chrono::milliseconds,而不必破坏任何这些名称空间中的任何内容。

或者,如果您真的想将所有内容都推送到同一个名称空间,请将其放入不同的名称空间:

namespace all {
    using namespace std;
    using namespace std::chrono;
}

虽然,正如我所说,值得怀疑。