我可以在宏中编写模板类吗?

时间:2014-01-13 19:18:58

标签: c++ templates macros

我有一个模板类A,我知道T取决于哪个类调用它。

例如,有10个类将使用A类,10个类中的一个称为file1

我可以编写类file1中显示的代码吗?

class D;

template<typename T>
class A
{
  protected:
      int a;
      int b;
      static T *ptr;
  public:
      static void set_a(int aa){ a = aa; }
      static D *create()
        { return new T(); }
};
我可以做以下的事情

 class file1
 {
    #define T file1   
     A<T>   
    #undef

     .....other data member vs member function
 }


 class file2
 {
    #define T file2   
     A<T>      
    #undef

     .....other data member vs member function
 }

原始代码如下:

其中anotherMacro1是

#define anotherMacro1(method)\
  public:\
  static return_type functionname(passingtype *ptr1, passingtype *ptr2)\
  {\
  return ((T *)ptr1)->method(ptr2);\
  }

=============================================== =======================

A也是一个宏

喜欢

 #define A \
  protected:\
      int a;\
      int b;\
      static T *ptr;\
  public:\
      static void set_a(int aa){ a = aa; }\
      static D *create()\
        { return new T(); }

=============================================== ===============================

   class file1_orginal
{
  #define T file1_orginal
   A()
   anotherMacro1(passingValue);
   anotherMacro2(passingValue);
  #endif

   .....other data member vs member function
}

首先我要删除A中的宏,所以我使用A类来替换宏A.

1 个答案:

答案 0 :(得分:2)

严格地说,是的,你可以这样做。实际上我不确定我认为有什么价值:

#define T file1
A<T>
#undef T

A<file1>

然而,你肯定让整个事情变得不那么可读了。重点是什么?这似乎是寻找问题的解决方案。我无法想象这是一个解决问题的问题。


好的,所以考虑到你的示例宏,我建议逐步重构模板。在宏内部使用“受保护”的可见性是值得怀疑的,但我们会保留它。我从这开始:

template<class CRTP>    //Curiously Recurring Template Pattern
class A {
    protected:
        int a;
        int b;
        static CRTP *ptr;
    public:
        void set_a(int aa){ a = aa; }
        static D *create() { return new CRTP(); }  //D is a base class?
};

然后:

class file1 : public A<file1> {
    #define T file1
        anotherMacro1(passingValue);
        anotherMacro2(passingValue);
    #undef T
    ...
};

这使用curiously recurring template pattern来转发A中的成员。我从来没有尝试过基类中受保护的成员,但我似乎记得受保护的成员是继承的,并作为受保护的成员继续使用遗产。我认为这些受保护成员的设计需要很差,并且会将它们重构为访问器功能,但我认为这可以满足您的需求。稍后您可以重构另一个Macro1和另一个Macro2的内容。