具有可变条件的通用比较函数

时间:2013-11-27 12:24:49

标签: c abstract-data-type

我正在尝试使用该功能

List listFilter(List list , CompareFunction func);

,众所周知,根据特定条件从给定列表返回过滤列表;参数列表。

这是CompareFunc的定义:

typedef int (*CompareFunc)(ListElement);

ListElement当然是void *。

我目前正在解决一个问题,其中ListElement是一个存储有关某人的信息的对象,而该信息包括他们的年龄。

我正在尝试编写一个函数,根据年龄对给定的人员列表进行分组,这显然会有所不同,因此我正在尝试编写一个函数,将ListElement与int进行比较,即一个人的年龄与一个年龄类别,分别假设它是如此定义的:

bool ageIsValid(ListElement person , int ageCategory);

并将其作为参数传递给listFilter。 但是,我遇到的问题是CompareFunc的定义不是由我决定的,即我是ADT列表的用户,所以我不能将ageIsValid直接传递给listFilter。

是否有可用的解决方案不依赖于全局变量? ,因为在我正在参加的这个特定课程中,它不受欢迎。

非常感谢所有答案:)

编辑:

我刚才有了一个想法,我想知道它是否有效:

我将定义一个静态函数:

    static List listFilterCustom(List list , int age){
        static bool filterByAge(ListElement element){
            /* pAge = getAgeOfPerson(element); */
            return pAge == age;
        }
        return listFilter(list , filterByAge);
     }

即,我将在listFilterCustom范围内定义一个函数,其中可识别变量age,从而排除全局变量的使用。 这个解决方案有效吗?

1 个答案:

答案 0 :(得分:0)

您必须修改listFilter;例如接受带有不透明指针的附加参数:

List listFilter(List list, CompareFunction func, void *info);
必须相应地修改

CompareFunction以接受此void *指针。

您可以在此参数中传递其他信息(例如&wanted_age_category)并将其强制转换回您的编译器。