Статический вызов виртуальной функции через указатель функции

Пожалуйста, обратите внимание на следующий код.

#include <iostream>
#include <memory>

struct A {
  A() {}
  virtual void f() {
    std::cout << "A::f" << std::endl;
  }
private:
  A(const A&);
};

struct B : public A {
  virtual void f() {
    std::cout << "B::f" << std::endl;
    call(&A::f);
  }
private:
  void call(void (A::*aMethod)()) {
    // ...
    (static_cast<A&>(*this).*aMethod)();
    //(static_cast<A>(*this).*aMethod)();  -> not allowed to copy!
    // ...
  }
};

void main() {
  std::auto_ptr<B> b (new B);
  b->f();
}

Этот код рекурсивно вызывает тот же метод B :: f , пока он не исчерпается из стека, а мне нужен ] вызвать метод для вызова A :: f . То есть он должен вызывать его статически, как обычно, если бы я просто написал:

struct B : public A {
  virtual void f() {
    std::cout << "B::f" << std::endl;
    // ...
    A::f();
    // ...
  }
};

Причина, по которой я хочу иметь Метод call заключается в разложении некоторого кода до и после «статического вызова», который является общим для нескольких методов с той же сигнатурой, что и f ...

Как я могу статически вызвать виртуальную функцию решено во время выполнения?

5
задан Xavier Nodet 3 December 2010 в 13:02
поделиться