可以基于宏定义具有多种类型的一个变量

时间:2016-11-04 15:39:32

标签: c++ macros

我想知道是否可以这样做:

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的其他地方。

3 个答案:

答案 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变量,并且它将被定义为程序中所有代码的类型......但它确实完全可能。