我想知道是否可以这样做:
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的其他地方。
答案 0 :(得分:3)
您可以按建议使用模板,但如果您只需要根据条件在两种类型之间切换,并且您可以访问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;
};
答案 1 :(得分:2)
正如评论中指出的,你不必使用宏,你可以使用模板化的类来实现这个目的:
template <typename T>
class MyClass
{
public:
MyClass();
static T myVariable;
};
然后以你喜欢的方式实例化它(例如int
类型):
MyClass<int>::myVariable;
答案 2 :(得分:1)
为什么不可能?这完全有可能。当然,您需要以某种方式在构建中传递该preproc变量,并且它将被定义为程序中所有代码的类型......但它确实完全可能。