1

我应该通过哈希表(指向数据链表的指针数组)和一些支持函数(即插入元素、删除表)编写 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函数。

有没有简单的方法来做这样的事情?

4

1 回答 1

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;
    }
  }
}
于 2012-04-22T17:15:12.463 回答