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
函数的代码。
有没有简单的方法可以做这样的事情?
答案 0 :(得分:5)
指定“任何参数类型”的传统方法是使用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;
}
}
}