在C ++中,我有两个结构(假设所有成员都是公共的):
struct A{
t1 d1;
t2 d2;
t3 d3;
...
t100 d100;
};
struct B{
t7 d7;
t3 d3;
t5 d5;
};
B中的成员是A成员的子集。
现在我需要一个函数将所有成员从B复制到A:
func(A a, B b) {
a.d7 = b.d7;
a.d3 = b.d3;
a.d5 = b.d5;
}
在未明确列出所有func
成员的情况下,实施B
的优雅方式是什么?授予A
是固定的,无法修改。
答案 0 :(得分:1)
如果你被允许改变A,你可以表达A和B之间的结构关系:
A可以继承自B,如果A实际上是一种B.你可以从A中删除公共元素(因为它们是从B继承的)。
A可以有一个B成员替换公共元素。
在这种情况下,您可以享受=
的使用(在第一种情况下,您有意使用切片,在第二种情况下,这将是一个干净的任务)。
如果你不能表达结构关系,那么就没有一般的安全方法,但是你有一份分配清单。
您不应该考虑memcopy()方法或类似方法,因为您无法确定元素是否具有相同的对齐方式。如果它不是POD元素,这可能会导致未定义的行为(内存泄漏,损坏,虚函数表损坏等等)。
答案 1 :(得分:0)
您给出的示例:
func(A a, B b) {
a.d7 = b.d7;
a.d3 = b.d3;
a.d5 = b.d5;
}
看起来像一个宏的好地方:
func(A a, B b) {
#define c(f) a.f = b.f
c(d7);
c(d3);
c(d5);
#undef c
}
答案 2 :(得分:0)
在未明确列出所有
func
成员的情况下实施B
的优雅方式是什么?
如果你使用C ++并且struct A
是可修改的,那么你可以使用class
并利用已经存在的优雅复制构造函数:
class_name (const class_name & class_object)
和复制作业:
class_name & class_name::operator= (const class_name & class_object)
以下是copy constructor和copy assignment进一步阅读的链接。