我想知道是否可以这样做:
class MyClass
{
public:
MyClass();
...
#if defined USE_TYPE_ONE
static TypeOne myVariable;
#else
static TypeTwo myVariable;
#endif USE_TYPE_ONE
};
原因是我有两个类,TypeOne &TypeTwo,具有相同的函数变量但不同的实现和我不想在每个地方使用宏myVariable被调用。
编辑
感谢您的及时评论和回答。我不得不提的是,MyClass已经被用于很多不同的类。这就是为什么我要避免模板。因为即使使用默认模板参数类型的模板类,我也必须使用<>(更改许多其他地方)用于我使用MyClass而无需TypeOne的其他地方。
您可以按照建议使用模板,但如果您只需要根据条件在两种类型之间切换,并且您可以访问c++ 11 <type_traits>
(否则考虑更新编译器),那么您可以使用std::conditional
:
#include <type_traits>
constexpr bool USE_TYPE_ONE = true;
struct TypeOne { };
struct TypeTwo { };
class MyClass {
using Type = std::conditional<USE_TYPE_ONE, TypeOne, TypeTwo>::type;
static Type myVariable;
};
正如在注释中指出的那样,您不必使用宏,您可以使用模板化类来实现这一点:
template <typename T>
class MyClass
{
public:
MyClass();
static T myVariable;
};
然后按你喜欢的方式实例化它(例如int
类型):
MyClass<int>::myVariable;
为什么不可能呢?这完全有可能。当然,你需要在构建过程中以某种方式传递这个preproc变量,并且它将被定义为程序中所有代码的类型……但这确实是完全可能的。