0

我正在尝试用 C++11 编写一个程序,该程序基于enums确定主应用程序的值。我知道以下作品:

namespace space
{
    enum class A { One, Two, Three };
}

space::A getSetting();

#define SETTING getSetting()

但是我也想根据第一个设置做一个条件编译来确定第二个设置,比如:

namespace space
{
    enum class A { One, Two, Three };
    enum class B { Red, Blue, Yellow };
    enum class C { Black, White };
    enum class D { Green, Orange };
}

space::A getSettingA();
space::B getSettingB();
space::C getSettingC();
space::D getSettingD();

#define SETTING_ONE getSettingA()
#if SETTING_ONE == A::One
    #define SETTING_TWO getSettingB()
#elif SETTING_ONE == A::Two
    #define SETTING_TWO getSettingC()
#else
    #define SETTING_TWO getSettingD()
#endif

这会提供“C4067:预处理器指令后出现意外标记 - 需要换行符”的编译器警告。我做了一些研究,发现我不能::在预处理器指令中使用范围运算符,但是有没有办法进行这种条件编译?

编辑:我基本上是在寻找一种将一个变量用于几个不同的方法enums,比如不透明的数据类型。使用#define是最简单的解决方案。我以相同的方式使用生成的设置,所以我不想跟踪我正在使用的特定枚举,只需要一个名称来调用任何设置。

已弃用:我已决定为我的问题找到不同的解决方案,并且不再寻求此问题的答案。

4

1 回答 1

0

这是错误的:#if SETTING_ONE == A::One

你不能用预处理器做到这一点。

使用模板,我会尝试诸如特征之类的东西。

enum{
    One = 58,Two = 54, Red = 65, //...
};
struct A{
    static int value1 = One;
    static int value2 = Two;
};
struct B{
    static int value1 = Red;
    static int value2 = Blue;
};

template <typename T>
struct setting_T{
    static int value1 = T::value1;
    static int value2 = T::value2;
};

typedef setting_T<A> setting; // this is you choice for this compilation (you could use B)

要使用它:

setting::value1 /* this is A::value1*/
于 2013-09-02T17:22:22.970 回答