Обратитесь к производной функции - PullRequest
3 голосов
/ 06 апреля 2011

У меня есть базовый класс и несколько производных. Я должен «зарегистрировать» некоторую статическую функцию от каждого из них. Вот пример:

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 ]

2 голосов
/ 07 апреля 2011

РЕДАКТИРОВАТЬ: полная замена предыдущего ответа из-за уточненных требований.

Вы можете использовать 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;
}
0 голосов
/ 07 апреля 2011

Мне просто интересно, если вы сделали что-то вроде

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() {  }
};
0 голосов
/ 07 апреля 2011

Это не легко сделать в C ++, но я не говорю, что это невозможно. Если вам нужен только список имен подклассов, эти ответы могут помочь:

Каким-то образом зарегистрировать мои занятия в списке

c ++ Список классов без инициализации их для использования статических функций

Кажется, вы можете выбрать макро-магию или boost mpl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...