[英]Parameters of passed function-pointer
我应该通过哈希表(指向数据链表的指针的数组)和一些支持功能(例如,插入元素,删除表)编写C ++ STL容器映射(关联数组)的C实现。我已经成功编写了所有这些,除了其中一个,它是foreach(table, function_ptr)
函数,该函数为表中的所有数据调用调用的函数(打印内容...)。
我有点卡在这里,因为我不知道应该将哪些参数传递给function_ptr
,所以它将是通用的。 就目前而言,我认为这是不可能的。
如果我只想将指针传递给printf例如,这很容易, foreach
原型看起来像这样
foreach(table_t *t, int (*function_ptr)(const char *fmt, ...))
我会像这样为每个数据节点调用它
function_ptr("%s, %d\n", node.key, node.data)
但是,如果有一天我想通过自己的函数使用此方法并改变主意,则还必须更改调用者函数和foreach
函数的代码。
有没有简单的方法可以执行这样的操作?
指定“任何参数类型”的常规方法是使用void *
如下所示:
foreach(table_t *t, int (*function_ptr)(void *p))
然后,您可以传递每个参数的地址(它可以是复杂的数据类型,如结构),然后该函数可以将其强制转换回适当的类型:
struct {
int x;
int y;
} numbers;
// Sums the numbers in a structure
int sum(void *p) {
numbers *n = (numbers *) p; // Cast back to the correct type
return n->x + n->y;
}
// Counts the number of 'a' chars in a string
int numberOfA(void *p) {
char *s = (char *) p;
int num = 0;
while (s != NULL && *s != '\0') {
if (*s == 'a') {
++num;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.