C++11 基于先前定义的条件编译

C++11 基于先前定义的条件编译,c++11,conditional-compilation,C++11,Conditional Compilation,我试图用C++11编写一个基于enum的程序,以确定主应用程序的值。我知道以下工作: namespace space { enum class A { One, Two, Three }; } space::A getSetting(); #define SETTING getSetting() 但我还想基于第一个设置进行条件编译,以确定第二个设置,例如: namespace space { enum class A { One, Two, Three }; enu

我试图用C++11编写一个基于
enum
的程序,以确定主应用程序的值。我知道以下工作:

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:预处理器指令后出现意外标记-需要换行符”。我做了一些研究,发现我不能在预处理器指令中使用作用域操作符
,但是有没有办法进行这种条件编译

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

不推荐:我已决定为我的问题找到一个不同的解决方案,不再寻求这个问题的答案。

这是错误的:#如果设置_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)

我知道代码不能正常工作。我正在寻找一种方法来进行这种条件编译。你不能使用枚举。也许是模板?你能提供一个使用模板的例子吗?你能告诉我你想如何使用它(在你的代码中)我的意思是这个设置的结果我希望能够像使用
后面的
枚举
一样使用它。因此,我没有使用
space::B::Red
,而是使用
SETTING_TWO
,因为
SETTING_TWO
可以是三个不同的
枚举中的任意一个。然后我使用
toString()
函数获取名称并打开正确的.xml文件。
getSettingA()
的值只能在运行时确定。您希望编译器如何在编译时学习它-使用时间机器?另外,您计划如何使用
设置\u TWO
(假设您设法定义了它)?你能举个例子吗?它可能有几种不同类型中的一种,基本上是不可预测的。此外,您是否依赖
“#SETTING_TWO”
将其设置为
“getSettingB()”
等等?这个问题对我来说太模糊了taste@JohannesSchaub-litb I对每个设置使用相同的格式,但
枚举中的值各不相同。我不依赖于
将\u TWO设置为任何特定的枚举,因为它们的使用方式完全相同。请看我的编辑。
setting::value1 /* this is A::value1*/