我正在实现一个通用的单链表,其中列表节点存储指向其数据的指针.
typedef struct sll_node
{
void *data;
struct sll_node *next;
} sll_node;
Run Code Online (Sandbox Code Playgroud)
为了实现一个适用于任何类型数据的通用查找子例程,我编写了它,以便它将一个函数指针作为参数作为参数,如下所示:
/* eq() must take 2 arguments. ex: strcmp(char *, char *) */
sll_node *sll_find(void *data, int (*eq)(), sll_node *root);
Run Code Online (Sandbox Code Playgroud)
您可以传递适用于手头数据类型的函数指针.因此,如果在列表节点中存储字符串,则可以将strcmp作为eq()函数传递,依此类推.它有效,但我仍然不满意..
有没有办法明确指定比较函数参数的数量而不放弃它的一般性?
我一开始尝试了这个:
sll_node *sll_find(void *data, int (*eq)(void *, void *), sll_node *root);
Run Code Online (Sandbox Code Playgroud)
我希望它能起作用.但是没有(编辑:它编译了一个警告,但我有 - 错误!),我不得不围绕strcmp编写一个包装函数,使其符合eq原型.
然后我尝试了:
sll_node *sll_find(void *data, int (*eq)(a, b), sll_node *root);
Run Code Online (Sandbox Code Playgroud)
要么:
typedef int (*equality_fn)(a, b);
sll_node *sll_find(void *data, equality_fn eq, sll_node *root);
Run Code Online (Sandbox Code Playgroud)
这两个都不会编译,因为:"只有函数定义才允许没有类型的参数列表"