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

强类型枚举的c++转换

c++
  •  3
  • chrise  · 技术社区  · 8 年前

    使用强类型枚举而不是枚举有几个很好的参数。然而,除了不必要的风险之外,int的可兑换性还提供了一些不错的用例。在我的例子中,主要是将其放入stringstream进行日志记录和比较。

    enum RiskLevel { None, Warn, Low, High, Critical };
    
    void logStuff( RiskLevel rl ) {
        stringstream ss;
        ss << rl;
        LOG(s);
    }
    
    void compareEnum( RiskLevel rl ) {
        if ( rl > RiskLevel::Low ) {
            ... 
        }
    }
    

    我确实怀念旧枚举的这些功能,我可能不是唯一一个。有什么好方法可以使用强类型枚举,并且仍然可以轻松地记录和比较它们?

    4 回复  |  直到 8 年前
        1
  •  4
  •   John Zwinck    8 年前

    您可以使用 std::underlying_type :

    void logStuff( RiskLevel rl ) {
        typedef std::underlying_type<RiskLevel>::type int_type;
        stringstream ss;
        ss << int_type(rl);
        Logger(ss);
    }
    
        2
  •  2
  •   Community CDub    7 年前

    定义一元 + 运算符执行到整数类型的转换。

    enum RiskLevel { None, Warn, Low, High, Critical };
    
    auto operator + ( RiskLevel value )
        { return std::underlying_type_t< RiskLevel >( value ); }
    
    void logStuff( RiskLevel rl ) {
        stringstream ss;
        ss << + rl;
        LOG(s);
    }
    
    void compareEnum( RiskLevel rl ) {
        if ( + rl > + RiskLevel::Low ) {
            ... 
        }
    }
    

    更深入 this answer .

        3
  •  2
  •   qxz    8 年前

    您可以(另外)实现自己的日志记录和比较重载,这为您提供了更大的灵活性:

    std::ostream& operator<<(ostream& os, RiskLevel rl) {
        os << std::underlying_type<RiskLevel>::type(rl);
        return os;
    }
    
    bool operator<(RiskLevel rl1, RiskLevel rl2) {
        return std::underlying_type<RiskLevel>::type(rl1) <
                   std::underlying_type<RiskLevel>::type(rl2);
    }
    

    然后,您可以让流插入运算符实际记录(比如)枚举器的名称。

        4
  •  2
  •   greedy52    8 年前

    也许可以利用c++11的enum类。您可以显式指定您想要的enum类型。

    enum class Boo : char {
        START = 'S',
        END = 'E'
    };
    
    enum class Foo :  unsigned int {
        TOP = 1,
        BOTTOM = 2
    };