C++变量赋值序列优化问询:如何简化多参数重复赋值的冗余逻辑
C++代码优化方案
核心优化思路
- 合并冗余存储:原代码中
typeX_Y独立变量和list_typeX存储内容完全一致,属于重复存储,直接将同组ClassB实例统一用std::vector存储,按下标取值即可,无需单独声明每个变量 - 消除重复函数:借助C++的
std::initializer_list特性实现任意参数数量的赋值逻辑,不需要随着变量增加修改函数参数列表、新增重复的Set方法 - 兼容原有调用:如果上层代码已有大量直接访问
type1_1这类变量的逻辑,可以通过内联getter函数做兼容,无需修改上层代码
优化后代码示例
.h 文件
#include <vector> #include <initializer_list> class ClassA { public: // 如果必须保留原有type1_1、type1_2的访问方式,增加内联getter即可 ClassB& type1_1() { return m_type_groups[0][0]; } const ClassB& type1_1() const { return m_type_groups[0][0]; } ClassB& type1_2() { return m_type_groups[0][1]; } const ClassB& type1_2() const { return m_type_groups[0][1]; } ClassB& type1_3() { return m_type_groups[0][2]; } const ClassB& type1_3() const { return m_type_groups[0][2]; } // type2系列同理,新增变量只需要加对应下标的getter,不用改存储逻辑 // 通用Set方法,第一个参数是组别:0对应type1,1对应type2,以此类推 void SetType(int group_idx, std::initializer_list<ClassB> values) { // 自动扩容组别 if (group_idx >= m_type_groups.size()) { m_type_groups.resize(group_idx + 1); } // 赋值+存入vector一步完成 m_type_groups[group_idx].assign(values); } __forceinline const std::vector<ClassB>& GetListofType(int group_idx) const { static std::vector<ClassB> empty; return group_idx < m_type_groups.size() ? m_type_groups[group_idx] : empty; } // 也可以保留原有GetListofType1、GetListofType2做兼容,直接调用上面的通用方法即可 __forceinline std::vector<ClassB> GetListofType1() { return GetListofType(0); } __forceinline std::vector<ClassB> GetListofType2() { return GetListofType(1); } private: // 二维vector:第一维是组别(type1、type2...),第二维是组内的每个ClassB实例 std::vector<std::vector<ClassB>> m_type_groups; };
调用示例
ClassA a; // 原来的SetType1(a,b,c)直接替换成下面的写法,传多少个参数都支持 a.SetType(0, {obj1, obj2, obj3, obj4}); // 访问原来的type1_1直接调用getter ClassB val = a.type1_1();
优化收益
- 新增同组变量不需要修改Set函数参数列表,支持任意数量的入参
- 新增type3、type4等新系列,不需要新增重复的Set、Get函数,直接用新的组别下标即可
- 消除了重复存储,减少了冗余赋值逻辑,后续维护成本大幅降低
内容的提问来源于stack exchange,提问作者1001cpp
相关产品推荐
相关产品推荐

