You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:57:48