将命名空间缩小到基础
shrinking namespace to base
有办法"shrink a namespace"吗?
例如
std::chrono::milliseconds
到 std::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::chrono
,std
外部:
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;
}
虽然,正如我所说,值得怀疑。
有办法"shrink a namespace"吗?
例如
std::chrono::milliseconds
到 std::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::chrono
,std
外部:
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;
}
虽然,正如我所说,值得怀疑。