我正在寻找一种消除代码冗余的方法。
我有两个结构B
和x
,成员变量为y
和C
。第三个结构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
。如何提取项目类型?可以使用宏吗?还有其他解决方案吗?预先感谢。