通过参数类型抽象消除C中的代码冗余

时间:2019-01-03 12:16:04

标签: c polymorphism void-pointers variable-types

我正在寻找一种消除代码冗余的方法。

我有两个结构Bx,成员变量为yC。第三个结构A*包含两个链接列表,一个包含B*项,另一个包含void*项。除了其节点存储void*数据外,链表实现并不重要。因此,访问此链接列表的项需要知道将A*数据强制转换为B*还是typedef struct { int x; int y; double z; } A; typedef struct { int x; int y; char t; } B; typedef struct { LinkedList* some_as; LinkedList* some_bs; } C;

这是我正在使用的结构:

C

现在,问题是,我有两个非常相似的功能,它们基于{ A*B*的值。这些功能的外观如下:

x

我想做的是提取需要插入y的两个链接列表之一中的项的类型(int func_for_a(C* c, A* a) { int index = -1; for (Node* node = c->some_as->head; node; node = node->next) { ++index; A* current = (A*) node->data; // some checks on a->x, current->x, a->y, and current->y // these checks affect `index' } return index; } int func_for_b(C* c, B* b) { int index = -1; for (Node* node = c->some_bs->head; node; node = node->next) { ++index; B* current = (B*) node->data; // same checks on b->x, current->x, b->y, and current->y // these checks affect `index' } return index; } A*),以及的行:

B*

这是不可能的,因为我无法访问C的成员int func_for_a_or_b(C* c, TYPE type, void* item) { Node* head; if (TYPE == A) { item = (A*) item; head = C->some_as->head; } else { item = (B*) item; head = C->some_bs->head; } int index = -1; for (Node* node = head; node; node = node->next) { ++index; (TYPE)* current = (TYPE*) node->data; // checks on current->x, item->x, current->y, and item->y // these checks affect `index' } return index; } x。如何提取项目类型?可以使用宏吗?还有其他解决方案吗?预先感谢。

0 个答案:

没有答案