考虑以下示例:
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
提供第二个重载来启用将基本函数指针与对派生对象的引用一起传递。
有更好的方法吗?上面的代码在某种程度上不会编译或做正确的事情是否安全?
答案 0 :(得分:3)
您可以摆脱第一个重载,因为更通用的覆盖了所有用例。
P.S。这似乎是std::invoke
的(更不通用)重新实现。如果可以访问C ++ 17,则可以改用它:
std::invoke(&foo::method, f);