简化C++ 03方式的接口声明

Dis*_*Stu 3 c++

作为减少复制/粘贴相同代码的繁忙工作的一种方法,我转向黑暗的一面并使用宏来为我做.

请记住,这是来自更大的生产代码,如果没有这样的宏,任务会更加痛苦.具体来说,它是由单个字符串驱动的静态和虚拟函数的混合.

现在我知道宏可以让你遇到麻烦,并且这种方式使用它们非常"臭",所以我想要更好的东西,但是我很难想出一些简单明了的东西:

#define LAZY(name)\
   static const char * identify() { return name; }\
   virtual const char * getName() { return identify(); }

class A{
public:
   LAZY("class A")

   void foo(){
      std::cout << getName() << std::endl;
   }
};

class B: public A{
public:
   LAZY("class B")
};

std::string somevar( B::identify() );

int main(void){
   B b1;
   B.foo();
}
Run Code Online (Sandbox Code Playgroud)

我采取的其他一些方法(以及它们失败的原因)如下:

template<class T>
class Base{
public:
   virtual const char * getName(){ return T::identify(); }

   // All other functions driven by string. IE:
   static void register(){ someFactory::reg( T::identify() ); }
   virtual unsigned int getHash(){ return someHashFoo( T::identify() ); }
};

class A: public Base<A> {
public:
   static const char * idenfity(){ return "class A"; }

   void foo(){ std::cout << getname() << std::endl; }
};

class B: public A, public Base<B> {
  // Conflict due to multi-inheritance.
};
Run Code Online (Sandbox Code Playgroud)

另一种失败的方法是由于每个实例浪费内存,而且有点复杂:

class FaceBase{
public:
   virtual const char * getName() =0;
};

template<class T>
class ImplBase: public FaceBase {
public:
   virtual const char * getName(){ return T::identify(); }
};

class A{
public:
   FaceBase & common;

   static const char * identify(){ return "class A"; }

   A(): common(ImplBase<A>()){}

   virtual void foo(){ std::cout << common.getName() << std::endl; }
};

class B: public A{
   static const char * identify(){ return "class B"; }

   B(){ common = ImplBase<B>(); }
};
Run Code Online (Sandbox Code Playgroud)

Seb*_*edl 6

你实际上并没有问过任何问题,但是假设它是"如何在没有宏的情况下以干净的方式做到这一点?",并进一步假设你所指的"更大"任务是一个完整的自定义RTTI系统,答案是,"你不能."

我所知道的每一个大项目(MFC,Qt,LLVM)都会做其中一个:

  • 使用宏.(MFC在某种程度上Qt)
  • 使用自定义代码生成器.(Qt和某种程度上LLVM)
  • 编写样板代码.(LLVM)

  • 我不同意这里没有任何不良因素适用,但无论如何这都是无关紧要的.当事情不合理时,预处理器应该是你的最后手段,但这是一个例子.当替代品更糟糕时,预处理器有多少问题并不重要. (2认同)