我可以在C中使用仿函数吗?我的意思是例如在C ++中我能做到:
struct Rules
{
operator()(/*maybe some args*/)
{
}
};
一些(虚构的)算法:
int sort(iter beg, iter end, Rules);
我可以在C中完全相同吗?
答案 0 :(得分:7)
不一样,没有。 C不支持结构的成员函数,也不支持运算符重载。
但是,您可以传递和存储函数指针。您可以使sort
使用比较函数指针获取结构,并调用传递的函数。有关示例,请参阅C标准库中的qsort
...
qsort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *));
最后一个参数是一个排序比较函数指针。您可以创建一个结构,如...
struct Rules_t
{
int (*comparisonRule)(const void *, const void *);
} Rules;
然后将此结构的实例传递给调用,例如myRules->comparisonRule(a, b)
。
答案 1 :(得分:2)
不是真的。充其量,您可以执行以下操作:
int sort(iter a, iter b, bool (*cmp)(iter a, iter b, void *), void *p_state)
{
...
cmp(a, b, p_state);
}
bool func(iter a, iter b, void *p_state)
{
type_t *p_type = (type_t *)p_state;
...
}
type_t state;
...
sort(a, b, func, &state);
这允许您提供功能状态,尽管是手动。
你可能能够隐藏宏背后的一些笨拙,但要注意宏!
答案 2 :(得分:0)
在C ++中struct
只是public class
。在C.中不是这种情况。