如何在C++中用更少重复代码设置结构体变量属性?
减少结构体间属性赋值的重复代码方案
你现在有两个结构体test1和test2,大部分成员变量相同,但当前逐个赋值的方式在成员增多时维护成本很高,下面提供几种更简洁的实现方式:
方案1:编写专属赋值成员函数
把重复的赋值逻辑封装到test1的成员函数里,以后要修改或新增成员,只需要维护这一个函数即可:
struct test2; // 前置声明test2 struct test1 { int a; int b; int c; int d; int f; int x; int y; int z; // 从test2对象批量赋值的函数 void assign_from(const test2& t2) { // 复制公共成员 a = t2.a; b = t2.b; d = t2.d; x = t2.x; y = t2.y; z = t2.z; // 处理test1独有的成员 c = 0; f = 11; } }; struct test2 { int a; int b; // int c; int d; int e; int x; int y; int z; }; int main(){ test1 t1; test2 t2{1,2,3,4,5,6,7}; t1.assign_from(t2); // 一行完成赋值 }
优点:逻辑集中,维护方便,类型安全,没有内存布局依赖。
方案2:重构提取公共基类(推荐长期维护)
如果两个结构体的公共成员占比很高,把公共部分抽成基类,利用继承简化赋值:
// 提取所有公共成员作为基类 struct BaseTest { int a; int b; int d; int x; int y; int z; }; struct test1 : BaseTest { int c; int f; }; struct test2 : BaseTest { int e; }; int main(){ test1 t1; test2 t2{1,2,3,5,6,7,4}; // 初始化顺序:基类成员 -> 派生类成员 // 直接赋值基类部分 static_cast<BaseTest&>(t1) = t2; // 处理test1独有的成员 t1.c = 0; t1.f = 11; }
优点:从根源上减少重复代码,新增公共成员时无需修改赋值逻辑,代码结构更清晰。
方案3:结构化绑定(C++17+)
利用C++17的结构化绑定简化公共成员的提取和赋值,适合成员数量不多的场景:
int main(){ test1 t1; test2 t2{1,2,3,4,5,6,7}; // 提取test2的公共成员到变量,用_忽略不需要的e成员 auto [t2_a, t2_b, t2_d, _, t2_x, t2_y, t2_z] = t2; // 批量赋值给test1 t1.a = t2_a; t1.b = t2_b; t1.d = t2_d; t1.x = t2_x; t1.y = t2_y; t1.z = t2_z; // 处理独有的成员 t1.c = 0; t1.f = 11; }
优点:比逐个写t2.xxx更简洁,类型安全;缺点:成员顺序变化时需要同步修改绑定代码。
方案4:内存拷贝(慎用)
仅当你能确保两个结构体的公共成员在内存中的布局完全一致时(比如都是标准布局类型,且公共成员的顺序、类型完全相同),可以用memcpy批量复制:
int main(){ test1 t1; test2 t2{1,2,3,4,5,6,7}; // 仅复制a和b(因为这两个成员在两个结构体中的位置和类型完全一致) memcpy(&t1.a, &t2.a, sizeof(t2.a) + sizeof(t2.b)); // 其他公共成员单独赋值 t1.d = t2.d; t1.x = t2.x; t1.y = t2.y; t1.z = t2.z; // 处理独有的成员 t1.c = 0; t1.f = 11; }
注意:这个方法有风险,C++标准不保证结构体成员的内存布局(除非是标准布局类型),一旦结构体成员顺序或类型修改,容易出现未定义行为,不推荐在生产代码中使用。
内容的提问来源于stack exchange,提问作者aliveforu
相关产品推荐
相关产品推荐

