不幸的是,我不得不使用第三方宏,它假设我在命名空间 thirdparty
中。但是这个宏声明了一些我需要在 thirdparty
命名空间之外的类型,所以我不能使用这个片段:
namespace thirdparty
{
TP_MACRO(my_type_name, inner);
}
如果我这样做,我所有声明的类型都将位于 thirdparty::
命名空间中,这将不起作用。
问题是 TP_MACRO
正在使用 thirdparty
命名空间内部的类型,但没有对它们进行限定。为了解决这个问题,我目前使用声明将这些类型带入当前范围:
using thirdparty::type1;
using thirdparty::type2;
TP_MACRO(my_type_name, inner);
这种方法的缺点是我用这些类型污染了全局命名空间,这通常是不好的做法(此代码在头文件中)。
我可以将上面的代码片段包装在一个新的命名空间中(我正在这样做),但我想知道是否有一种方法可以限制这些 using
声明的范围,以便在宏声明之后我的类型,我可以从周围的 namespace 中删除它们吗?
TP_MACRO
类似于(但实际上更复杂):
#define TP_MACRO (name, inner) \
typedef type1<inner> type1_##name; \
typedef type2<inner> type2_##name;
它也可能会发生变化,因此我会避免复制它的内容。
最佳答案
尝试在 thirdparty
内的嵌入式命名空间中声明类型,以便宏可以使用,然后为该命名空间添加别名,以便它可以在全局范围内访问:
namespace thirdparty::myns {
TP_MACRO(my_type_name, inner);
}
namespace myns = thirdparty::myns;
如果您不使用 C++17,则使用:
namespace thirdparty {
namespace myns {
TP_MACRO(my_type_name, inner);
}
}
关于c++ - 在 header 内限定 using 声明的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57526006/