【问题标题】:C++11: what is the proper way to migrate from old-style enum to enum class?C++11:从旧式枚举迁移到枚举类的正确方法是什么?
【发布时间】:2011-10-24 04:09:01
【问题描述】:

我目前正在将我的代码从旧式枚举迁移到枚举类。

强类型很好,但我在代码中遇到了一个点,我需要调用 ncurses 的 init_pair() 函数,该函数将 short int 作为其第一个参数,但我已将其转换为枚举类对开发人员友好的阅读。

为了让编译器满意,看来我需要在第一个参数上使用static_cast<short int>()

有没有更简洁的方法,或者如果我必须使用 static_cast,你建议我如何使用它?

接受的答案:Chris Dodd 的回答很好。在切换之前,我到处都有代表旧式枚举的整数。切换后,我在其余代码中都有一个带有类型安全枚举的脏强制转换。肮脏被隔离在一个地方,代码更安全,更容易阅读。这是一个显着的改进。

【问题讨论】:

    标签: c++ casting c++11 enums


    【解决方案1】:

    最干净的方法可能是定义 init_pair 的重载内联版本,它接受一个枚举并将其转换为调用正常版本:

    inline int init_pair(enum_type pair, short f, short b) {
        return init_pair(static_cast<short>(pair), f, b);
    }
    

    这样用户可以用你的枚举类型调用它,它就可以工作

    【讨论】:

    • 好主意 - 至少脏东西被隔离在一个地方 - 我将结束外部调用
    • 请注意,如果您只是想避免丑陋,short(pair)(short)pair 将同样有效;另一方面,与 C 风格和函数风格的强制转换不同,static_cast 确实具有易于搜索的优势!
    【解决方案2】:

    有没有更简洁的方法可以做到这一点,或者 static_cast 可以吗?

    清洁剂?您正在做一些不干净的事情:采用强类型值并将其更改为另一种类型。你故意绕过类型系统。当你做不干净的事情时,它应该看起来不干净。

    唯一“更干净”的方法是使用 C 风格的演员表。而且我不确定这是否“更干净”。

    【讨论】:

    • 不幸的是,init_pair() 是一个外部库调用,所以我无法修改该接口
    • Chris Dodd 的建议是正确的 - 将脏代码隔离到一个位置,并在整个代码库中严格使用 enum_type。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多