首页 > 解决方案 > 如何从另一个命名空间中扩展 C++ 命名空间?

问题描述

假设命名空间library::symbols中定义了许多变量,这些变量应该在启动时初始化,如下所示:

namespace library {
    class Symbol; // details not relevant here

    namespace symbols {
        inline const Symbol S1 = Symbol("S1");
        inline const Symbol S2 = Symbol("S2");
    }
}

现在,我需要添加更多来自其他地方的内容,引用回符号命名空间(伪代码):

namespace app {
    namespace ::library::symbols {
        inline const Symbol S3 = Symbol("S3");
        inline const Symbol S4 = Symbol("S4");
    }
}

这背后的基本原理是拥有一组可扩展的全局常量,可以在运行时进行比较、解析和打印(示例名称 S1...S4 在这里是任意的)。

该示例无法编译。我尝试了很多想法,但似乎还没有找到任何解决方案。我错过了什么?有没有办法重新打开和扩展library::symbols命名空间?是否有替代方法来实现这一点,例如通过模板专业化?


编辑: 重新构建问题和第二个代码片段以更准确。我遇到的问题是如何在当前命名空间之外扩展命名空间。在示例中,我需要在命名空间app中扩展符号

所以问题是是否有一种方法可以将别名返回到更高级别的名称空间,而不会导致声明新名称空间。

标签: c++namespaces

解决方案


Is there a way to reopen and extend the library::symbols namespace? 

是的,你说的。只需重新打开library::symbols命名空间并将更多数据放入其中。例如:

namespace library
{
    class Symbol;

    namespace symbols
    {
        inline const Symbol S1 = Symbol("S1");
        inline const Symbol S2 = Symbol("S2");
    }
}

// Maybe in another file
namespace library
{
    class Symbol;

    namespace symbols
    {
        inline const Symbol S3 = Symbol("S1");
        inline const Symbol S4 = Symbol("S2");
    }
}

namespace app
{
    using namespace library;

    Symbol dummy()
    {
        // Here use a namespace variable
        return symbols::S3;
    }
}

如果您在另一个文件中重新打开命名空间,您只需要记住包含正确的标题。


推荐阅读