gpt4 book ai didi

C++ 使用类方法作为函数指针类型

转载 作者:太空狗 更新时间:2023-10-29 20:49:05 24 4
gpt4 key购买 nike

在 C 库中,有一个等待函数指针的函数:

lasvm_kcache_t* lasvm_kcache_create(lasvm_kernel_t kernelfunc, void *closure)

其中 lasvm_kernel_t 定义为:

typedef double (*lasvm_kernel_t)(int i, int j, void* closure);

现在,如果我将类中定义的方法发送到 lasvm_kcache_create:

double cls_lasvm::kernel(int i, int j, void *kparam)
...
lasvm_kcache_t *kcache=lasvm_kcache_create(&kernel, NULL);

我得到:“无法将‘double (cls_lasvm::)(int, int, void)’转换为‘double ()(int, int, void) '"

我该怎么办?

最佳答案

我假设 closure参数是一个上下文“cookie”,用于使用回调来获取适当的上下文。这是回调函数的一个常见习语,根据您提供的片段,这似乎是正在发生的事情(但我不确定,因为我对 kcache_create() 一无所知,除了您在此处发布的内容).

您可以使用该 cookie 将指针传递给 cls_lasvm例如你正在处理这样的事情:

extern "C"
double
lasvm_kcache_create_callback( int i, int j, void* closure)
{
// have to get a cls_lasvm pointer somehow, maybe the
// void* clpsure is a context value that can hold the
// this pointer - I don't know

cls_lasvm* me = reinterpret_cast<cls_lasvm*>( closure);

return me->kernel( i, j)

}


class cls_lasvm //...
{

...

// the callback that's in the class doens't need kparam
double cls_lasvm::kernel(int i, int j);

};

...

// called like so, assuming it's being called from a cls_lasvm
// member function

lasvm_kcache_t *kcache=lasvm_kcache_create(&lasvm_kcache_create_callback, this);

如果我认为闭包是上下文 cookie 是错误的,那么 cls_lasvm 中的回调函数类需要是静态的:

extern "C"
double
lasvm_kcache_create_callback( int i, int j, void* closure)
{
// if there is no context provided (or needed) then
// all you need is a static function in cls_lasvm

return cls_lasvm::kernel( i, j, closure);
}

// the callback that's in the class needs to be static
static double cls_lasvm::kernel(int i, int j, void* closure);

请注意,用 C++ 实现的 C 回调函数必须extern "C" .它可能看起来像类中的静态函数一样工作,因为类静态函数通常使用与 C 函数相同的调用约定。然而,这样做是一个等待发生的错误(见下面的评论),所以请不要 - 通过 extern "C"包装器代替。

如果closure不是上下文 cookie,出于某种原因 cls_lasvm::kernel()不能是静态的,那么你需要想出一种方法来存储 this指向某处并在 lasvm_kcache_create_callback() 中检索该指针函数,类似于我在第一个示例中所做的方式,除了指针必须来自您自己设计的某种机制。请注意,这可能会导致使用 lasvm_kcache_create()不可重入和非线程安全。这可能是问题,也可能不是问题,具体取决于您的具体情况。

关于C++ 使用类方法作为函数指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1738313/

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