通用集初始化为保留任何类型的项目

时间:2014-07-06 16:51:13

标签: c

我正在尝试实现通用和动态集数据结构,但我正在努力使用泛型部分。我知道它本质上是一个类型指针到void的数组,但我不知道如何让用户选择要添加到特定集合的元素类型。我已经彻底搜索了这个网站,但似乎没有我的问题的答案。 dynamic_set类型定义如下:

typedef struct
{
    int size;
    int capacity;
    void ** data;
} dynamic_set;

我需要知道元素的类型,以便能够对指针进行类型转换并最终取消引用它们,以便我可以检查这些集合是否与union相兼容,以决定应用哪种类型的函数来返回我应该在上面的结构中包含另一个成员来表示该集合中元素的类型,如enum?非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

我建议你使用pointers-to-functions来提供指针存储值的操作:

struct DynamicSet
{
    void** Items;
    size_t Size;
    size_t Capacity;
    int (*compare)(void*, void*);
};


DynamicSet* DynamicSet_Create(size_t capacity,
                              int (*compare)(void*, void*));

int CompareInts(void* left, void* right)
{
    int leftInt = *((int*)left);
    ...
}

DynamicSet* dynamicSet = DynamicSet_Create(100, CompareInts);

要将其与其他类型一起使用,您只需编写另一个Comparator函数。

但如果您想要更多类型安全和更方便的签名,您可以尝试模仿C++ templates with macro substitution