gpt4 book ai didi

c++ - 将限定的非静态成员函数作为函数指针传递

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:12 25 4
gpt4 key购买 nike

我在外部库中有一个无法使用以下签名更改的函数:

void registerResizeCallback(void (*)(int, int))

我想传入一个成员函数作为回调,因为我的回调需要修改实例变量。

显然这是不可能的一个简单的:

registerResizeCallback(&Window::Resize);

所以我不太确定如何解决这个问题。

最佳答案

作为Igor Oks indicates ,你不能这样做。这个问题的其余部分与其说是您问题的答案,不如说是讨论这样的事情应该如何与正确设计的回调 API 一起工作(看起来您正在使用的不是)。

大多数设计良好的回调接口(interface)都允许您提供“void *”或其他一些方式来获取回调中的上下文。在 C++ 中使用 this 的一种常见方法是在 void * 上下文参数中传递一个对象指针,然后回调函数可以将其转换回对象指针并调用成员方法来完成真正的工作.很遗憾,您使用的回调 API 未提供上下文数据。

严格来说,回调必须是extern "C",但是使用静态成员方法进行回调是很常见的,我认为在实践中从来没有问题。 (这是假设回调 API 是一个 C 接口(interface),这是迄今为止最常见的)。

一个例子:

// callback API declaration's

extern "C" {
typedef unsigned int callback_handle_t;

typedef void (*callback_fcn_t)( void* context, int data1, int data2);

callback_handle_t RegisterCallback( callback_fcn_t, void* context);
void UnregisterCallback( callback_handle_t);
}

// ----------------------------------

// prototype for wrapper function that will receive the callback and
// transform it into a method call

extern "C"
static void doWorkWrapper( void* context, int data1, int data2);


// the class that does the real work

class worker {
public:
worker() {
hCallback = RegisterCallback( doWorkWrapper, this);
}

~worker() {
UnregisterCallback( hCallback);
}

void doWork( int data1, int data2) {
// ...
};

private:
callback_handle_t hCallback;
};

// the wrapper that transforms the callback into a method call
extern "C"
static void doWorkWrapper( void* context, int data1, int data2)
{
worker* pWorker = static_cast<worker*>( context);

pWorker->doWork( data1, data2);
}

关于c++ - 将限定的非静态成员函数作为函数指针传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/499153/

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