This question already has answers here:
Simulation of templates in C (for a queue data type)

(10 个回答)


5年前关闭。




有没有办法在C中创建通用数据结构并根据存储的数据类型使用函数,具有各种类型的数据并且例如可以根据存储的数据打印的结构。

例如,

假设我希望制作一个只存储了 float 和 int 的二叉搜索树。自然的做法是创建一个带有 int 和 float 的枚举。它看起来像这样:
Typedef enum {INT, FLOAT} DataType;

Typedef struct node
{
    void *data;
    DataType t;
    struct node *left,
                *right;
}Node;

如果我想打印出来:
void printTree(Node *n)
{
    if (n != NULL)
    {
        if (n->t == INT)
        {
            int *a = (int *) n->data;
            printf("%d ", *a);
        }
        else
        {
            float *a = (float *) n->data;
            printf("%f ", *a);
        }

        printTree(n->left);
        printTree(n->right);
    }
}

没关系,但我想将另一种数据类型存储为堆栈、查询或其他内容。所以这就是为什么我创建了一个不依赖于特定数据类型的树,例如:
Typedef struct node
{
    void *data;
    struct node *left,
                *right;
}Node;

如果我想打印出来,我使用回调函数,例如:
Node *printTree(Node *n, void (*print)(const void *))
{
    if (n != NULL)
    {
        print(n->data);
        printTree(a->left);
        printTree(a->right);
    }
}

但是当我尝试插入一个整数和一个浮点数并将其打印出来时它会下降。我的问题是,对于混合数据类型,是否有一种方法可以创建通用数据结构,该结构例程在一种情况下依赖于特定数据类型,但在另一种情况下则不依赖于特定数据类型?在这种情况下,我应该创建一个存储 int 和 float 存储它的结构,并在回调函数中使用第一个打印代码中的打印函数?

观察:我只是在结构中声明了一个节点,并对其进行了所有尝试以简化它,但想法是将结构与 .h 和 .c 以及所有涉及数据结构的抽象一起使用。

最佳答案

C 不支持这种通用数据类型/结构。您有几个选项可以选择:

  • 如果您有机会使用 Clang 作为编译器,那么 overload functions in C. 有一个语言扩展,但是您必须将参数强制转换为特定类型,以便编译器知道要调用哪个函数。
  • 使用 C++
  • 虽然你仍然需要转换参数,所以编译器知道他必须调用哪些称为 print 的可用函数。
  • 使用 templates
  • 创建一个名为 print 的函数,它采用类似
    struct data_info {
      void *data;
      enum_describing_type type;
    }
    
    print 进行切换并调用适当的 printIntprintFloat 等。
  • 关于c - C中的通用数据结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20532035/

    10-11 22:58
    查看更多