繁体   English   中英

传递的函数指针的参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM