参考派生函数

时间:2011-04-06 19:50:57

标签: c++ class inheritance static

我有一个基类和一些衍生物。我必须从每个人“注册”一些静态函数。这是一个例子:

class Base
{
   // Some interface...
};

class Der1 : Base
{
   static void Do();
};
class Der2 : Base
{
   static void Do();
};

void processStatic()
{
   SomeFunc(Der1::Do);
   SomeFunc(Der2::Do);
}

如您所见,SomeFunc接收函数指针。我希望每个新衍生类自动执行此操作,是否可能?也许,在Base类中预定义静态函数并在那里注册它。但我认为这是不可能的,是吗?


也许,这将更容易理解我想要什么:

class Der1 : Base
{
   Der1() { SomeFunc(Der1::Do); }
   static void Do();
};
class Der2 : Base
{
   Der2() { SomeFunc(Der2::Do); }
   static void Do();
};

3 个答案:

答案 0 :(得分:2)

编辑:由于明确的要求,完全取代以前的答案。

您可以使用CRTP来声明一个专门的基类,它只会调用您的注册函数:

#include <iostream>
void SomeFunc(void(*fp)()) {
  (*fp)();
};

template <class D>
struct ExtraBass {
  ExtraBass() {
    static bool once;
    if(!once)
      SomeFunc(D::Do);
    once = true;
  }
};

struct Bass {
};

struct Drive : Bass, ExtraBass<Drive>  {
  static  void Do() { std::cout << "Drive::Do\n"; }
};

struct Deride : Bass , ExtraBass<Deride> {
  static  void Do() { std::cout << "Deride::Do\n"; }
};

int main() {
  Drive d1;
  Deride d2;
  Deride d3;
}

答案 1 :(得分:0)

在C ++中这不是一件容易的事情,但我不是说这是不可能的。如果您只需要一个子类名称列表,这些答案可能有所帮助:

Somehow register my classes in a list

c++ List of classes without initializing them for use of static functions

似乎宏魔法或者升级mpl是您的首选工具。

答案 2 :(得分:0)

我只是想知道,如果你做了像

这样的事情
void SomeFunc(void (*doFunc)())
{ 
   doFunc();
}

template <class T> int Register()
{
    SomeFunc(T::Do);
    return 0;
}

template <class T> class Base
{
   static int _i;
};

template <class T> int Base<T>::_i =  Register<T>();

class Derived : Base<Derived>
{
   public:
   static void Do() {  }
};