C++ 使用类(C+;+;)中的枚举

C++ 使用类(C+;+;)中的枚举,c++,enums,C++,Enums,我使用的是一个库,它有很多枚举类。这里有一个例子 class TGNumberFormat { public: // ... enum EAttribute { kNEAAnyNumber kNEANonNegative kNEAPositive }; enum ELimit { kNELNoLimits kNELLimitMin kNELLimitMax kNELLimitMinMax }; enum EStepSiz

我使用的是一个库,它有很多枚举类。这里有一个例子

class TGNumberFormat
{
  public:
  // ...
  enum EAttribute {   kNEAAnyNumber
    kNEANonNegative
    kNEAPositive
  };
  enum ELimit {   kNELNoLimits
    kNELLimitMin
    kNELLimitMax
    kNELLimitMinMax
  };
  enum EStepSize {   kNSSSmall
    kNSSMedium
    kNSSLarge
    kNSSHuge
  };
  // etc...
};

例如,在代码中,我必须将它们称为
TGNumberFormat::kNEAAnyNumber
。我正在编写一个经常使用这些值的GUI,代码越来越难看。是否有某种方法可以导入这些枚举并键入
kNEAAnyNumber
?我真的不希望这些名字有任何重叠。我已经尝试了多种方法使用
using
关键字,但是没有一种方法可以编译。

如果您在代码中使用这些常量,那么创建自己的头来重新定义名称空间中的值可能是有益的。然后可以使用该命名空间
。您不需要重新定义所有的值,只需要重新定义枚举数的名称。比如说,

namespace TGEnumerators
{
    static EAttribute const kNEAAnyNumber(TGNumberFormat::kNEAAnyNumber);
    // etc.
}
typedef TGNumberFormat NF;
NF::EAttribute attribute = NF::kNEAAnyNumber;
或者,您可以在经常使用的函数或源文件中,将def
TGNumberFormat
键入为较短的名称。比如说,

namespace TGEnumerators
{
    static EAttribute const kNEAAnyNumber(TGNumberFormat::kNEAAnyNumber);
    // etc.
}
typedef TGNumberFormat NF;
NF::EAttribute attribute = NF::kNEAAnyNumber;

我认为后一种方法更优越,如果在块范围内明智地使用,是一种很好的实践。但是,为了在文件中使用,为了清楚起见,我认为最好使用枚举数的全名。

如果您使用c++11,则可以使用关键字auto来推断类型:

//the compiler will see auto and know to use: TGNumberFormat::EAttribute
auto attribute = TGNumberFormat::kNEAAnyNumber;
编译时使用:g++-std=c++0x-o main.cpp

如果您不使用C++ 11,请考虑使用@ James McNellis


不建议使用宏,因为它们不会遵守作用域规则——typedefs会遵守。另一种可能的方法是定义一批常量,然后改用:

e、 g

两种解决方案:

  • 接受它
  • #定义AnyNumber TGNumberFormat::kNEAAnyNumber

  • *运行cover…*

    我将使用函数的本地typedef(例如
    typedef TGNumberFormat NF;
    ,例如允许
    NF::kNELLimitMin
    )。不过,我认为最好键入名称。
    struct X:TGNumberFormat{}。然后可以将它们用作
    X::kNEAAnyNumber
    。我不建议您这样做,因为
    TGNumberFormat
    (表面上)比你为
    X
    +1想出的任何更短的名字都有更多的意义。我记不清有多少次我见过一个裸露的枚举器,并且想知道它到底从哪里来,因为它被一个鬼鬼祟祟的
    typedef
    使用的
    隐藏了起来。只是一句小小的注释:对于值重新定义(你的第一种方法),我认为最好使用
    static const EAttribute
    而不是普通的
    EAttribute
    @Mark来明确链接是内部的。代码没有必要工作,但我认为它更自我描述。