作用域 Pre C++11 的最佳替代方案

Best alternative for scoped Pre C++11

本文关键字:方案 最佳 Pre C++11 作用域      更新时间:2023-10-16

我想在我的代码中的几个地方开始使用枚举,但我对编译器以前的声明有问题。枚举当前如何声明对我来说最有意义:

避免这种情况的最佳方法是什么?

enum score_methods_t {NONE,ABS_FROM_PERFECT,ERROR_SQUARED};
enum scale_methods_t {NONE,CASES_MULTIPLIER,RANGE_MULTIPLIER};

我应该让所有内容都唯一,还是使用命名空间的作用域?我想在类中使用枚举类型,而 NONE 是最具描述性的名称!

枚举冲突的原因也是因为本质上 thay 只是在引擎盖下 #defines??

在 C++11 之前,我使用了:

struct score_methods { enum type { NONE, ABS_FROM_PERFECT, ERROR_SQUARED }; };

这意味着您始终具有实际enum类型的score_methods::type和值的score_methods::NONE等。

另外,不,它们不仅仅是#define,因为您可以将它们放入不同的命名空间或类中(如上所示(,这是预处理器无法执行/处理的操作。

您始终可以将枚举放在类中:

struct Score
{
     enum Method { None, AbsFromPerfect, ErrorSquared };
};

用法:

void foo(Score::Method m);
foo(Score::None);

我发现当我使用按位无作用域枚举时,我获得了自动转换为 int 的好处,同时仍然能够引用位,例如,IoType::输入给定:

enum IoType
    {
    Indeterminable = 0,
    Input          = 1,
    Output         = 2,
    IOput          = Input|Output,
    };