gpt4 book ai didi

C++类成员函数回调

转载 作者:太空狗 更新时间:2023-10-29 23:31:11 26 4
gpt4 key购买 nike

我有以下问题。我有一个来自外部库的函数(无法修改),如下所示:

void externalFunction(int n, void udf(double*) );

我想作为 udf 函数传递到现有类的函数成员之上。请看下面的代码:

// External function (tipically from an external library)
void externalFunction(int n, void udf(double*) )
{
// do something
}

// User Defined Function (UDF)
void myUDF(double* a)
{
// do something
}

// Class containing the User Defined Function (UDF)
class myClass
{
public:
void classUDF(double* a)
{
// do something...
};
};

int main()
{
int n=1;

// The UDF to be supplied is myUDF
externalFunction(n, myUDF);

// The UDF is the classUDF member function of a myClass object
myClass myClassObj;
externalFunction(n, myClassObj.classUDF); // ERROR!!
}

我无法将classUDF成员函数声明为静态函数,所以上面代码的最后一行导致编译错误!

最佳答案

这是不可能做到的 - 在 C++ 中,您必须使用自由函数或静态成员函数,或者(在 C++11 中)没有捕获的 lambda 来获取函数指针。

GCC 允许你创建嵌套函数,它可以做你想做的事,但只能在 C 中。它使用所谓的蹦床来做到这一点(基本上是一小段动态生成的代码)。可以使用此功能,但前提是您将一些调用 externalFunction 的代码拆分到单独的 C 模块中。

另一种可能性是在运行时生成代码,例如。使用 libjit .

因此,如果您不介意非重入函数,请创建一个指向 this 的全局/静态变量,并在您的静态函数中使用它。

class myClass
{
public:
static myClass* callback_this;
static void classUDF(double* a)
{
callback_this.realUDF(a);
};
};

它的代码真的很糟糕,但我担心像您的 externalFunction 这样糟糕的设计会让您倒霉。

关于C++类成员函数回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8079453/

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