gpt4 book ai didi

c++ - 发布几个回调作为函数参数

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

我有几个函数。

void a();
bool b();
void c(int x, int y);

一个函数看起来像那样。

void setListener(void * listenerCallback);

我必须将所有这些函数(a、b、c)作为“setListener”函数的参数发送。

setListener(&a);
setListener(&b);
setListener(&c);

如何在不重载 setListener 函数的情况下做到这一点?


我发现了一种变体。虽然我认为他可能会导致内存问题。但实际上它与 Lundin 的解决方案相同,只是没有 union 。

typedef unsigned int varCallback;

enum callbackType {
C_VOID,
C_BOOL,
C_VOID_INT_INT,
}

void setListener(varCallback callbackPointerAddress, callbackType type) {
/// code
}

void a() {};
bool b() {};
void c(int x, int y) {};

setListener((varCallback)&a, C_VOID);
setListener((varCallback)&b, C_BOOL);
setListener((varCallback)&c, C_VOID_INT_INT);

最佳答案

当你标记这个 C 时,这里还有一个 C 解决方案(视为伪代码):

typedef enum
{
FPTR_VOID_VOID,
FPTR_BOOL_VOID,
FPTR_VOID_INT_INT
} Func_ptr_t;

typedef struct
{
Func_ptr_t type;

union
{
void(*void_void)();
bool(*bool_void)();
void(*void_int_int)(int, int);
};
} My_func_ptr_t;


My_func_ptr_t var = {FPTR_VOID_VOID, &a};
setListener(&var);

编辑:

(不过,这还是假的,我还没有编译测试)

void setListener (void * listenerCallback)
{
const My_func_ptr_t* func_ptr;

func_ptr = (const My_func_ptr_t*) listenerCallback;

switch(func_ptr->type)
{
case FPTR_VOID_VOID:
{
func_ptr->void_void();
break;
}
...
}
}

编辑 2:

顺便说一句,应该注意的是,这是在 C 中通用地传递多个函数指针的唯一方法。从一个函数指针到另一种指针类型的野外类型转换是未定义的行为。

关于c++ - 发布几个回调作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5284990/

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