c++ - 如何通过函数指针调用派生方法?
问题描述
考虑这个例子:
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
a void (base::*) ()
not a void (foo::*)()
,但后来我意识到我可以提供第二个重载 forcall_it
以启用将基函数指针与对派生对象的引用一起传递。
有没有更好的方法来做到这一点?从无法编译或做正确的事情的意义上说,上述内容是否安全?
解决方案
您可以摆脱第一个重载,因为更通用的重载涵盖了它的所有用例。
PS 这似乎是对std::invoke
. 如果您有权访问 C++17,则可以使用它:
std::invoke(&foo::method, f);
推荐阅读
- android - 在android中创建一个带有图标的按钮
- c++ - 什么是调用“isPalindrome”没有匹配的函数?
- reactjs - 反应最小最大范围的年份选择器
- javascript - Javascript - 获取每个 selectpicker 选定值的自定义属性
- angular - Angular 10/11:找不到管道“ngrxPush”
- python - Python:仅将索引展平一级
- dynamics-crm - 无法在工作流 - CRM 中分配事件
- search - 在 Sitefinity 后端动态模块搜索中搜索标题以外的字段
- c# - NSwag 变更控制器说明
- gatsby - 生产 Gatsby 博客未在 MDX 文件中呈现 TailwindCSS 类