gpt4 book ai didi

c++ - 如何柯里化(Currying)对象上的方法以将其作为 C 样式回调传递?

转载 作者:行者123 更新时间:2023-11-30 03:51:38 27 4
gpt4 key购买 nike

假设我们有以下类 A :

class A
{
public:
void sum(int x);
};

我们有一个函数 f ,它获得一个 C 风格的回调,其中一个参数类型为 int并称它为:

typedef void (*Callback)(int);

void f(Callback cb)
{
cb(5);
}

在 C++ 中有什么方法可以柯里化(Currying)一个方法 A::printA 类型的对象上并将其传递给函数 f ?像这样:

void main()
{
A a;
auto curry_a = ??; // something like curry_a = [&](int x) { a.sum(x) };
f(curry_a);
}

std::bind和 lambda 函数不是解决方案,因为它们创建类型为 std::function<> 的对象重载operator() .它看起来像 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);
// ...

这是通过全局变量为普通函数提供上下文的唯一方法。

关于c++ - 如何柯里化(Currying)对象上的方法以将其作为 C 样式回调传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31154334/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com