c++ - 传递成员函数作为参数
问题描述
我有一个运行回调的函数:
void run_callback(void(*callback)(uint32_t)) {
callback(100);
}
这适用于静态函数,
void global_callback(uint32_t);
int main() {
run_callback(global_callback);
}
但不是成员函数。
class A {
int x;
public:
void callback(uint32_t);
};
int main() {
A foo;
run_callback(foo.callback);
}
我使用静态包装函数来解决这个问题。
void run_member_callback(void* obj, void(*callback)(void*,uint32_t)) {
callback(obj, 100);
}
class B {
int x;
public:
static void static_callback(void* obj, uint32_t value) {
static_cast<B*>(obj)->callback(value);
}
void callback(uint32_t);
};
int main() {
B foo;
run_member_callback(&foo, foo.static_callback);
}
有没有一种简单的方法可以将成员函数作为参数传递?
编辑:
我试图避免 STL,并且模板不是一个选项,因为我的实现run_callback
是虚拟的。
解决方案
你正在做一些奇怪的,C-ish 的事情。使用 C++ 功能。我个人会使用模板run_callback
和 lambda 来传递成员函数:
template <class F>
void run_callback(F callback)
{
callback(100);
}
class A
{
int x;
public:
void callback(uint32_t);
};
int main()
{
A foo{};
run_callback([&](uint32_t a) { return foo.callback(a); });
}
如果您通过引用捕获对象,请注意它比run_callback
调用更有效。否则按价值捕获。
推荐阅读
- spring - Sonatype 扫描显示 Spring-Web 存在漏洞
- sql - 每次自动将值从一个表读取到另一个表?
- database - 无法加载 timescaledb-1.6.0.dll - 不是有效的 Win32 应用程序
- selenium - 第一个测试仅在 appium 中按预期运行
- python - 将定制功能应用于 pandas df
- linux - Run GUI app in linux docker on linux server on windows host
- php - 使用 WPDB 连接外部数据库,用 php 插入动态表单数据
- r - 如何在没有数据框的 ggplot2 中创建直方图?
- python - JDownloader API json.decoder.JSONDecodeError
- android - Android以编程方式改变方向?