访问C ++枚举器的哪种方式更好?

时间:2012-12-04 17:24:00

标签: c++ enums

我正在寻找一些最佳实践建议。如果你有一个用C ++声明的类,那么:

class Foo {
public:
    enum { A, B, MAX};
};

是否应该像以下一样访问枚举:

Foo::A

Foo *var; 
var->A;

直到今天,我总是访问Foo::A之类的常量值,而不是通过类类型的ptr。事实上,我甚至不相信这是可能的。有没有人遇到过何时以及是否应该使用每个表格,还是应该坚持使用久经考验的Foo::A方法?

编辑:让Foo变成Foo * var这是一个错字,因为大多数人都发现了感谢。

3 个答案:

答案 0 :(得分:6)

枚举与类相关联,而不是与实例相关联。所以Foo::A更好。

答案 1 :(得分:2)

据推测,您的示例应该声明指针Foo * var或以var.A的形式访问枚举器。

如果你没有可用的对象或指针,那么显然“class”形式Foo::A是唯一明智的选择。

如果你这样做,那么两种形式都是等同的。在我看来,“类”形式更具表现力,因为它匹配与类的关联而不是对象。它也可能与那些不相信它有效的人保存争论。

在某些情况下(例如在模板中,或者使用auto类型声明的对象),类名可能很复杂甚至未知,在这种情况下,“对象”形式会更好:

template <typename T>
void f()
{
    typename some::complicated::type::depending_on<T>::type var;
    var.thing = var.A;            // OK
    var.thing = decltype(var)::A; // Ugly, requires C++11
    var.thing = some::complicated::type::depending_on<T>::type::A; // Yuck!
}

答案 2 :(得分:1)

第一版更好,就像@ KevinA.Naude所说。如果您正在寻找一种方法来为enum设置范围,您可能需要查看C ++ 11 enum class,它允许您使用enum class X {A, B, MAX};等强制执行的结构范围 - 您需要X::A来引用它的内部。