首页 > 解决方案 > 如何通过函数指针调用派生方法?

问题描述

考虑这个例子:

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::methoda void (base::*) ()not a void (foo::*)(),但后来我意识到我可以提供第二个重载 forcall_it以启用将基函数指针与对派生对象的引用一起传递。

有没有更好的方法来做到这一点?从无法编译或做正确的事情的意义上说,上述内容是否安全?

标签: c++c++11templatesmember-function-pointers

解决方案


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

PS 这似乎是对std::invoke. 如果您有权访问 C++17,则可以使用它:

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

推荐阅读