代码之家  ›  专栏  ›  技术社区  ›  Flovdis

是否有一个C++用于使用短枚举值的上下文的建议?

  •  2
  • Flovdis  · 技术社区  · 7 年前

    我用 enum class 在我们的代码中无处不在。有时,名称空间会堆积起来,从而降低代码的可读性:

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

    using 声明:

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

    经济衰退的负面影响 使用 语句是对 Type . 万一 enum 名称改为 Foo ,此代码将保留

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

    enum CompassPoint {
        case north
        case south
        case east
        case west
    }
    
    func foo(dir: CompassPoint) {
        // ...
    }
    

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

    foo(.north)
    

    是否有一个类似C++的C++建议?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Barry    7 年前

    据我所知,没有类似的建议确切地适用于这种情况。也就是说,为了减少噪音 初始化 作用域枚举数。它在风格上似乎类似于指定的初始值设定项(对于C++20来说是新的),但有点反对将作用域枚举数。。。你知道的,范围很广。


    那个 问题来了 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);
    

    但这并不是说不详细(除非您在同一范围内多次执行该操作)。