c++ - 在 header 内限定 using 声明的范围

标签 c++ c++14

不幸的是,我不得不使用第三方宏,它假设我在命名空间 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/

相关文章:

c++ - 使用 OpenCV 改进文本二值化/OCR 预处理

c++ - 视频处理OpenCV?

c++ - 在 C++ 中解析不同类型的逗号分隔数据

c++ - 成员函数中的 decltype(auto) 忽略无效主体,decltype(expr) 失败

c++ - 避免并发等待对象中的死锁

c++ - 如何在*成员被销毁后*在析构函数中执行一些代码

c++ - 如何填充unique_ptr数组?

c++ - doxygen:pdf 中损坏的目录

c++ - 按类型访问具有重复类型的 std::tuple 应该会产生编译错误

c++ - 有什么简单的方法可以为 std::array 和 std::vector 实现算术运算?