我想写一个结构来封装一些这样的函数:
typedef struct _Operate {
void * op_fun;
size_t result_type;
unsigned int arg_count;
size_t arg_type[];
} * Operate;
这里的op_fun
是这个操作的函数指针。 result_type
是函数返回的类型。 arg_count
是参数的数量,arg_type
保留参数的类型。换句话说,op_fun
是这样的:
result_type ( * op_fun)(type_1 arg_1, type_2 arg_2, ... , type_N arg_N);
N
,起初可能不知道,直到给出 arg_cuont
。 type_1
是 arg_type[1]
,type_2
是 arg_type[2]
以此类推。
而我的问题是:如何重建函数指针?因为当函数指针变成op_fun
时,就变成了void *
.它的参数和返回类型的信息已经丢失。我必须通过仅给出 result_type
、arg_count
和 arg_type
来重建它。
在这种情况下,它节省了我很多开发时间,如下所示:
void traverseTree(TreeNode tree_root, Operate operate)
{
for(int i = 0; i < tree_root->n_children; i++) {
traverseTree(tree_root->children[i], operate);
}
doOperate(operate, tree_root);
}
这样我就不必每次遍历树时都编写这些代码(它实际上节省了我的时间)。
但我希望它不是编译时行为,那只是一个 语法糖。我想知道是否有实现它的方法。
最佳答案
无法以这种方式动态创建函数调用。如果你想要一种通用调用函数的方法,你需要给它们一个通用接口(interface)。
如果你看看 pthread_create
函数是如何定义的:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
它接受一个线程启动函数的函数指针,它接受一个 void *
参数并返回一个 void *
以及一个 void *
表示参数。您的 traverseTree
代码也应该这样做:
void traverseTree(TreeNode tree_root, void *(*func)(TreeNode, void *), void *args)
{
for(int i = 0; i < tree_root->n_children; i++) {
traverseTree(tree_root->children[i], func, args);
}
func(tree_root, args);
}
对于给定函数的参数,您可以创建一个包含这些参数的结构并将指针传递给它。然后在函数中,将 void *
参数转换为指向正确结构类型的指针。
关于c - 如何在 C 中封装这样的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69377414/