gpt4 book ai didi

c++ - 为什么将枚举放在结构中然后使用 typedef 名称?

转载 作者:太空狗 更新时间:2023-10-29 23:35:01 24 4
gpt4 key购买 nike

我发现以下模式在我们公司的代码中使用得相当普遍。

struct Foo
{
enum FType
{
TypeA,
TypeB,
Type_MAX
};
};
typedef Foo::FType FooType;
[...]
FooType m_type;

我的问题是,这样做有什么好处? (或者,这避免了什么问题?)说清楚,我想知道为什么他们不只是...

enum FooType
{
TypeA,
TypeB,
Type_MAX
};
[...]
FooType m_type;

我不能问原来的程序员,因为他们被重新分配了,结果我们公司指定的主题专家实际上是我。

如果有帮助的话,这段代码已经在不同的时间使用许多版本的 MSVC、gcc 和 clang 为不同的目标平台编译...都是 C++11 之前的版本。

谁能看出为什么这样做?如果答案变得微不足道,请提前致歉。

编辑添加:这是在内部类中使用的。 (当枚举是全局的时,我们的风格指南要求条目以公共(public)前缀开头,以便将它们与其他符号区分开来。)

最佳答案

普通旧枚举的感知问题是枚举数成为定义枚举的范围内的名称。因此,您可以说,例如,

FooType m_type;
m_type = TypeA;

如果您还定义了一个类名TypeA,您就会有冲突。将枚举放在类中意味着您必须使用范围限定符来获取名称,这将消除冲突。这也意味着你必须写

FooType m_type;
m_type = FooType::TypeA;

因为以前的版本无效。

这个问题的一个更新的解决方案是作用域枚举:

enum class FooType {
TypeA,
TypeB,
Type_MAX
};

现在你可以说

FooType m_type;
m_type = FooType::TypeA;

但不是

m_type = TypeA;

这里的一个区别,正如@Jarod42 指出的那样,由普通枚举定义的枚举器可以隐式转换为 int,而作用域枚举中的枚举器则不能。所以在类中定义,

int i = FooType::TypeA;

是有效的,并且 i 获得值 0。对于作用域枚举,它是无效的。

在这两种情况下,强制转换都可以进行转换:

int i = static_cast<int>(FooType::TypeA);

关于c++ - 为什么将枚举放在结构中然后使用 typedef 名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51308845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com