如何在对象上获取一个方法,以便将其作为C样式回调传递
How to curry a method on an object for passing it as a C-style callback?
假设我们有以下类A
:
class A
{
public:
void sum(int x);
};
我们有一个函数f
,它得到一个C风格的回调,其中有一个类型为int
的参数,并调用它:
typedef void (*Callback)(int);
void f(Callback cb)
{
cb(5);
}
C++中是否有任何方法可以在类型为A
的对象上编写方法A::print
并将其传递给函数f
?类似这样的东西:
void main()
{
A a;
auto curry_a = ??; // something like curry_a = [&](int x) { a.sum(x) };
f(curry_a);
}
std::bind
和lambda函数不是一个解决方案,因为它们使用重载的operator()
创建类型为std::function<>
的对象。它看起来像C++中的currying,但在我的情况下不能使用它。我需要一个真正的函数指针,即实时生成代码。
你运气不好,无法以令人满意的方式完成:唯一与C兼容的函数指针是函数(或类函数,但不是实例函数)。
因此,您必须创建一个修复参数的函数,例如成员函数的this
。设置此参数的唯一方法是通过全局变量:
A *instance;
void (A::*a_fun)(int);
void applicator(int arg) { instance->*a_fun(arg); }
//...
int main() {
A a;
instance = &a;
a_fun = &A::sum;
f(applicator);
// ...
这是通过全局变量为普通函数提供上下文的唯一方法。
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 访问类C++ C 样式回调
- 通过实用程序 fn 将捕获的 lambda 传递给 C 样式回调 - 错误
- C++ 11 - 将 C 样式回调绑定到类成员函数
- 使 C 样式回调对象面向
- 在返回值和"回调"之间做出决定时的样式与一致性
- 如何在对象上获取一个方法,以便将其作为C样式回调传递