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

时间:2019-05-24 11:47:19

标签: c++ c++11 templates member-function-pointers

考虑以下示例:

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提供第二个重载来启用将基本函数指针与对派生对象的引用一起传递。

有更好的方法吗?上面的代码在某种程度上不会编译或做正确的事情是否安全?

1 个答案:

答案 0 :(得分:3)

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

P.S。这似乎是std::invoke的(更不通用)重新实现。如果可以访问C ++ 17,则可以改用它:

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