是否有人建议 c++ 将上下文用于短枚举值?

Is or was there a proposal for c++ to use the context for short enum values?

我在代码中到处都使用 enum class。有时,名称空间会堆积起来,使代码的可读性降低:

_infoSign->setType(ui::InfoSign::Type::Ok);

我知道,我可以用 using 声明来缩短它:

using Type = ui::InfoSign::Type;
_infoSign->setType(Type::Ok);

using 语句的缺点是 Type 的定义。如果 enum 名称更改为 Foo,此代码将保留 Type 名称并且必须手动更新。

Swift 使用一种有趣的方式来处理枚举值:

enum CompassPoint {
    case north
    case south
    case east
    case west
}

func foo(dir: CompassPoint) {
    // ...
}

对于函数调用,编译器将自动使用正确的上下文并允许使用非常短的形式来指定枚举值:

foo(.north)

C++ 是否有类似语法的提案?

据我所知,没有针对这种情况的类似提案。也就是说,减少 初始化 作用域枚举器中的噪声。它在风格上似乎与指定初始化器(C++20 的新功能)相似,但有点反对作用域枚举器的想法……你知道,作用域。


关于枚举 类 更常见的问题是 switch 语句的冗长。对于那个问题,有P1099: Using Enum,减少了

std::string_view to_string(rgba_color_channel channel) {
  switch (channel) {
    case rgba_color_channel::red:   return "red";
    case rgba_color_channel::green: return "green";
    case rgba_color_channel::blue:  return "blue";
    case rgba_color_channel::alpha: return "alpha";
  }
}

std::string_view to_string(rgba_color_channel channel) {
  switch (my_channel) {
    using enum rgba_color_channel;
    case red:   return "red";
    case green: return "green";
    case blue:  return "blue";
    case alpha: return "alpha";
  }
}

我想你也可以这样写:

using enum ui::InfoSign::Type;
_InfoSign->SetType(Ok);

但这并没有真正减少冗长(除非您在同一范围内多次执行该操作)。