c++ - 作用域枚举的 "using namespace X"等效项?

标签 c++ enums c++11

我正在使用范围枚举来枚举我正在实现的某些状态机中的状态。例如,让我们这样说:

enum class CatState
{
    sleeping,
    napping,
    resting
};

在我定义状态转换表的 cpp 文件中,我想使用等同于 using namespace X 的东西,这样我就不需要在所有状态名称前加上前缀 猫状态::。换句话说,我想使用 sleeping 而不是 CatState::sleeping。我的转换表有很多列,因此避免使用 CatState:: 前缀会使内容更加紧凑和可读。

那么,有没有办法避免一直输入 CatState::


是的,是的,我已经意识到使用命名空间 的缺陷。如果强类型枚举有等效项,我保证只在我的 cpp 实现文件中的有限范围内使用它,而不是作恶。

最佳答案

So, is there a way to avoid having to type CatState:: all the time?

在 C++20 之前没有。正如没有为静态类成员键入 ClassName:: 的等价物一样。你不能说 using typename ClassName 然后进入内部。强类型 enum 也是如此。

C++20 添加了 using enum X 语法,它看起来像什么。

您当然可以不使用enum class 语法,只使用常规的enum。但是你会失去强类型。

应该注意的是,对弱类型枚举使用 ALL_CAPS 的原因之一是为了避免名称冲突。一旦我们有了完整的作用域和强类型,枚举的名称就被唯一标识并且不能与其他名称冲突。能够将这些名称带入 namespace 范围会重新引入此问题。因此,您可能希望再次使用 ALL_CAPS 来帮助消除名称歧义。

关于c++ - 作用域枚举的 "using namespace X"等效项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33827423/

相关文章:

c# - 通过命名管道在 MQL5(或 C++)和 C# 之间进行交互

c++ - 递归寻路直到除法结果为 1

c++ - 使用 `std::future` 的右值引用作为参数是否合法?

c++ - 可变参数模板函数的特化

c++ - 使用右值引用延长临时对象的生命周期

c++ - std::any std::unique_ptr 不起作用?

c++ - 什么等于 Eigen C++ 中 Python 的 np.linalg.solve(A, B)

java - 通过创建可以接受枚举的方法使代码更简洁

java - java如何支持java枚举常量的实例变量?

c# - 在枚举中使用 DateTime 对象