我可以在C中使用仿函数吗?

时间:2010-10-24 15:23:50

标签: c++ c

我可以在C中使用仿函数吗?我的意思是例如在C ++中我能做到:

struct Rules
{

    operator()(/*maybe some args*/)
    {
    }
};

一些(虚构的)算法:

int sort(iter beg, iter end, Rules);

我可以在C中完全相同吗?

3 个答案:

答案 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.中不是这种情况。