如何通过函数指针调用派生方法?

How to call derived method via function pointer?

考虑这个例子:

struct base {
    void method() {};
};

struct foo : base {};

template <typename T,typename R>
void call_it(T& t, R (T::*f)()) {
    (t.*f)();
}

template <typename T,typename B,typename R>
void call_it(T& t, R (B::*f)()) {
    (t.*f)();
}    

int main() {
    base b;
    call_it(b,&base::method);
    foo f;
    call_it(f,&foo::method);
}

起初我有点惊讶 &foo::methodvoid (base::*) () 而不是 void (foo::*)(),但后来我意识到我可以为 call_it 提供第二个重载允许将基函数指针与对派生对象的引用一起传递。

有更好的方法吗?从无法编译或做正确的事情的意义上说,以上是否安全?

您可以摆脱第一个重载,因为更通用的重载涵盖了它的所有用例。

P.S。这似乎是 std::invoke 的(更不通用的)re-implementation。如果您有权访问 C++17,则可以改用它:

std::invoke(&foo::method, f);