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

Flo*_*dis 2 c++ enums namespaces c++20

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

_infoSign->setType(ui::InfoSign::Type::Ok);
Run Code Online (Sandbox Code Playgroud)

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

using Type = ui::InfoSign::Type;
_infoSign->setType(Type::Ok);
Run Code Online (Sandbox Code Playgroud)

using声明的缺点是自己的定义Type.如果enum名称更改为Foo,此代码将保留Type名称,并且必须手动更新.

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

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

func foo(dir: CompassPoint) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

foo(.north)
Run Code Online (Sandbox Code Playgroud)

是否存在针对类似语法的C++提议?

Bar*_*rry 5

对于我所知道的那种情况,没有类似的提案.也就是说,减少初始化范围的枚举器时的噪音.它似乎与指定的初始化器(C++ 20的新版本)类似,但有点反对作用域的枚举器的想法......你知道,作用域.


关于枚举类的更常见的问题是switch语句中的冗长.对于那个问题,有P1099:使用枚举,减少

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";
  }
}
Run Code Online (Sandbox Code Playgroud)

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";
  }
}
Run Code Online (Sandbox Code Playgroud)

我想你也可以写:

using enum ui::InfoSign::Type;
_InfoSign->SetType(Ok);
Run Code Online (Sandbox Code Playgroud)

但这并不是那么冗长(除非你在同一范围内多次进行该操作).