是否有办法在头文件或更好的选项中使用常规的if/else来代替预处理器指令?


class MyMainClass{
//somecodes
// #define XXX 1
#ifdef XXX
VClass *x = new Class1();
#else
VClass *x = new Class2();
#endif
//some other codes
}

我在头文件中有这段代码来选择我将为程序使用哪个类。我有一个全局头文件。如果我在那里定义了一个变量,我可以在header中使用它而不需要ifdef, define子句吗?如:上面:

constexpr bool glb = true;

并使用它与常规的if/else或其他东西之间的对象实例化选择?

答案是肯定的;下面的代码是一个例子。

#include <cstdlib>
class VClass
{
public:
VClass() {/* empty */}
};
class Class1 : public VClass
{
public:
Class1() {/* empty */}
};
class Class2 : public VClass
{
public:
Class2() {/* empty */}
};
enum {
VCLASS_TYPE_CLASS1 = 0,
VCLASS_TYPE_CLASS2,
// additional types could be added here in the future
NUM_VCLASS_TYPES
};
constexpr int glb = VCLASS_TYPE_CLASS1;  // set this per your preference
class MyMainClass
{
public:
MyMainClass() {/* empty */}
~MyMainClass() {delete x;}
private:
VClass * CreateX() const
{
switch(glb)
{
case VCLASS_TYPE_CLASS1: return new Class1();
case VCLASS_TYPE_CLASS2: return new Class2();
default:                 std::abort();  // bad glb setting!?
}
}
VClass * x = CreateX();
};
int main(int, char **)
{
MyMainClass mmc;
return 0;
}