通过使用普通enum
,最好使用显式值来避免在枚举中间无意插入。这非常重要,因为枚举项可以隐式转换为整数。
enum class
怎么样?设置显式值仍然是一个好习惯,或者这只是一种“过时”的行为吗?
E.g:
enum class Animal
{
Dog = 0,
Cat = 1
};
答案 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 ++指南建议给予所有或所有枚举的显式值,但即使这样也是相当严格的,并且有合理且安全的用例仅用于仅给出一些枚举值
enum
和enum class
之间没有任何区别。一方面安全的东西在另一方面是安全的。