有没有更好的方法在标头中用 C++ 表达嵌套命名空间

2022-01-14 00:00:00 namespaces syntax c++

我从 C++ 切换到 Java 和 C#,并认为命名空间/包的使用在那里更好(结构良好).然后我回到 C++ 并尝试以相同的方式使用命名空间,但所需的语法在头文件中很糟糕.

I switched from C++ to Java and C# and think the usage of namespaces/packages is much better there (well structured). Then I came back to C++ and tried to use namespaces the same way but the required syntax is horrible within the header file.

namespace MyCompany
{
    namespace MyModule
    {
        namespace MyModulePart //e.g. Input
        {
            namespace MySubModulePart
            {
                namespace ...
                {
                    public class MyClass    

以下内容对我来说也很奇怪(为了避免缩进):

The following seems strange to me too (to avoid the deep indent):

namespace MyCompany
{
namespace MyModule
{
namespace MyModulePart //e.g. Input
{
namespace MySubModulePart
{
namespace ...
{
     public class MyClass
     {

有没有更短的方式来表达上面的事情?我错过了类似的东西

Is there a shorter Way to express the above thing? I am missing something like

namespace MyCompany::MyModule::MyModulePart::...
{
   public class MyClass

更新

好吧,有人说 Java/C# 和 C++ 中的用法概念不同.真的吗?我认为(动态)类加载不是命名空间的唯一目的(这是一个非常技术推理的观点).为什么我不应该将它用于可读性和结构化,例如考虑IntelliSense".

Ok, some say the concept of usage in Java/C# and C++ is different. Really? I think (dynamic) class loading is not the only purpose for namespaces (this is a very technical reasoned perspective). Why shouldn't I use it for a readability and structurization, e.g think of "IntelliSense".

目前,命名空间与您可以在其中找到的内容之间没有逻辑/粘合.Java 和 C# 在这方面做得更好... 为什么包括 <iostream> 并具有命名空间 std?好的,如果您说逻辑应该依赖标头来包含,为什么#include 不使用IntelliSense"友好语法,如 #include <std::io::stream>?我认为默认库中缺少的结构化是 C++ 与 Java/C# 相比的一个弱点.

Currently, there is no logic / glue between a namespace and what you can find there. Java and C# does this much better... Why including <iostream> and having namespace std? Ok, if you say the logic should rely on the header to include, why does the #include does not uses an "IntelliSense" friendly syntax like #include <std::io::stream> or <std/io/stream>? I think the missing structurization in the default libs is one weakness of C++ compared to Java/C#.

如果狂热冲突的唯一性是一个点(这也是 C# 和 Java 的一个点),一个好主意是使用项目名称或公司名称作为命名空间,你不这么认为吗?

If uniqueness to avid conflicts is one Point (which is a point of C# and Java, too) a good idea is to use the project name or company name as namespace, don't you think so?

一方面有人说 C++ 是最灵活的......但每个人都说不要这样做"?在我看来,C++ 可以做很多事情,但与 C# 相比,在许多情况下,即使是最简单的事情,它的语法也很糟糕.

On the one hand it's said C++ is the most flexible... but everyone said "don't do this"? It seems to me C++ can do many things but has a horrible syntax even for the easiest things in many cases compared to C#.

更新 2

大多数用户说创建比两个级别更深的嵌套是无稽之谈.好的,那么 Win8 开发中的 Windows::UI::Xaml 和 Windows::UI::Xaml::Controls::Primitives 命名空间呢?我认为微软对命名空间的使用是有道理的,而且它确实比 2 级更深.我认为更大的库/项目需要更深的嵌套(我讨厌像 ExtraLongClassName这样的类名,因为你可以把所有东西都放到全局命名空间中.)

Most users say it is nonsense to create a deeper nesting than two Levels. Ok, so what about Windows::UI::Xaml and Windows::UI::Xaml::Controls::Primitives namespaces in Win8 development? I think Microsoft's usage of namespaces makes sense and it is indeed deeper than just 2 Levels. I think bigger libraries / projects need a deeper nesting (I hate class names like ExtraLongClassNameBecauseEveryThingIsInTheSameNameSpace... then you could put everything into the global namespace, too.)

更新 3 - 结论

大多数人说不要这样做",但是……即使是 boost 的嵌套也比一两层更深.是的,它是一个库,但是:如果您想要可重用的代码 - 将您自己的代码视为您将提供给其他人的库.我还使用更深的嵌套来使用命名空间进行发现.

Most say "don't do it", but... even boost has a deeper nesting then one or two levels. Yes, it is a library but: If you want reusable code - treat your own code like a library you would give someone else. I also use a deeper nesting for discovery purposes using namespaces.

推荐答案

C++17 可能会简化嵌套命名空间定义:

C++17 might simplify nested namespace definition:

namespace A::B::C {
}

等价于

namespace A { namespace B { namespace C {
} } }

请参阅 cppreference 上命名空间页面上的 (8):
http://en.cppreference.com/w/cpp/language/namespace

See (8) on namespace page on cppreference:
http://en.cppreference.com/w/cpp/language/namespace

相关文章