c++ - 如何从另一个命名空间中扩展 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中扩展符号。
所以问题是是否有一种方法可以将别名返回到更高级别的名称空间,而不会导致声明新名称空间。
解决方案
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;
}
}
如果您在另一个文件中重新打开命名空间,您只需要记住包含正确的标题。
推荐阅读
- mysql - 你如何为 Orange 设置 MySQL 连接?
- android - 单击事件时,从 SQLite 自动刷新另一个选项卡
- ruby-on-rails - 如何将参数传递给方法创建
- python - 如何在python中使用正则表达式从字符串中提取小数点数字和百分比
- angular - Asp.net CORE 3.0 web API 方法总是接收 NULL 值
- python - 如何在 Python 中融化或取消堆叠数据帧?
- assembly - 引导加载程序未加载内核
- asp.net-mvc-5 - 无法匹配任何路由 url 段 Visual Studio 2015
- vue.js - 如何配置我的 Nuxt 前端应用程序以了解使用 Strapi 的后端的 baseUrl?
- java - 你如何在 IntelliJ 上运行 devtools?