如何通过函数指针调用派生方法?
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::method
是 void (base::*) ()
而不是 void (foo::*)()
,但后来我意识到我可以为 call_it
提供第二个重载允许将基函数指针与对派生对象的引用一起传递。
有更好的方法吗?从无法编译或做正确的事情的意义上说,以上是否安全?
您可以摆脱第一个重载,因为更通用的重载涵盖了它的所有用例。
P.S。这似乎是 std::invoke
的(更不通用的)re-implementation。如果您有权访问 C++17,则可以改用它:
std::invoke(&foo::method, f);
考虑这个例子:
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::method
是 void (base::*) ()
而不是 void (foo::*)()
,但后来我意识到我可以为 call_it
提供第二个重载允许将基函数指针与对派生对象的引用一起传递。
有更好的方法吗?从无法编译或做正确的事情的意义上说,以上是否安全?
您可以摆脱第一个重载,因为更通用的重载涵盖了它的所有用例。
P.S。这似乎是 std::invoke
的(更不通用的)re-implementation。如果您有权访问 C++17,则可以改用它:
std::invoke(&foo::method, f);