我试图在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
是最简单的解决方案。我以相同的方式使用结果设置,因此我不想跟踪我正在使用的特定枚举,只需要一个名称来调用任何设置。
弃用:我已经决定为我的问题找到不同的解决方案,而不再寻求这个问题的答案。
答案 0 :(得分:0)
这是错误的: #if SETTING_ONE == A :: One
你不能用预处理器做到这一点。
使用模板我会尝试类似traits的东西。
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*/