具有显式值的C ++枚举类

时间:2018-03-28 09:46:38

标签: c++

通过使用普通enum,最好使用显式值来避免在枚举中间无意插入。这非常重要,因为枚举项可以隐式转换为整数。

enum class怎么样?设置显式值仍然是一个好习惯,或者这只是一种“过时”的行为吗?

E.g:

enum class Animal
{
    Dog = 0,
    Cat = 1
};

3 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,那么您指的是二进制兼容性。在过去你无法转发声明枚举时,你会看到类似这样的东西:

//Some header
enum Animal
{
    AnimalDog = 0,
    AnimalCat = 1
};

// Some other header, not #including the previous one    
void func(int an_animal); // Accepts an Aninal enum

当然,如果枚举被更改,那么为了二进制兼容性的利益,在枚举结束时添加新的枚举器是非常重要的。

它是否随着范围内的枚举而改变?嗯,是的,不。你可以宣告声明一个范围的枚举。

//Some header
enum class Animal
{
    Dog = 0,
    Cat = 1
};

// Some other header, not #including the previous one    
enum class Animal;
void func(Animal);

所以现在你有一些额外的类型安全和范围,以避免命名空间污染。但是关于二进制兼容性的相同考虑适用。

所以我会说是的。继续使用范围枚举来做你正在做的事情。

答案 1 :(得分:0)

ex2 = pd.DataFrame({"col1": ["banana", "tomato"], "col2": ["cat", "dog"], "col3": ["phone", "tv"]}) ex2.isin(ex).all().all() >> False 相同,只会添加其值的类型安全性和位置(您需要使用限定名称)。

答案 2 :(得分:0)

在您发布的代码段中,没有必要为枚举项提供明确的值,无论是enum还是enum class。仅给出枚举的显式值的一些可能是不安全的,但是给它们 none 这些值是安全的。

作为示例,MISRA C ++指南建议给予所有或所有枚举的显式值,但即使这样也是相当严格的,并且有合理且安全的用例仅用于仅给出一些枚举值

enumenum class之间没有任何区别。一方面安全的东西在另一方面是安全的。