包装类的专业化

问题描述

我有以下包含简单成员变量和基本构造函数的类:

struct SimpleStruct {
    SimpleStruct() = default;
    SimpleStruct(const int& a,const int &b,const double& c,const double& d,const double& e) : 
             A(a),B(b),C(c),D(d),E(e) {}
    
    int A,B;
    double C,D,E;
    // etc.. more properties could be added or removed to this class
};

我想考虑SimpleStruct的集合,因此决定创建一个包装器类。我可以看到两个基本选项:

class WrapperOne {
    public:
        Wrapper(const size_t& sz) { 
            SS.resize(sz); 
            nElements = 0;
        }

        void Push(const SimpleStruct& ss) { SS[nElements++] = ss; }

        std::vector<int> getA() const { 
            std::vector<int> result(SS.size());
            for (size_t i = 0; i < SS.size(); ++i) 
                result[i] = SS[i].A;
            return result;
        }
        // std::vector<int> getB() ... etc. for the remaining SimpleStruct member variables 
    private:
        std::vector<SimpleStruct> SS;
        size_t nElements;
};

class WrapperTwo {
    public: 
        WrapperTwo(const size_t& sz) {
            As.resize(sz);
            Bs.resize(sz);
            Cs.resize(sz);
            // etc.
            nElements = 0;
        }

        void Push(const SimpleStruct& SS) {
             As[nElements] = SS.A;
             Bs[nElements] = SS.B;
             Cs[nElements] = SS.C;
             // etc
             nElements++;
        }

        std::vector<int> getA() const { return As; }
        // etc.
    
    private:
        std::vector<int> As;
        std::vector<int> Bs;
        std::vector<double> Cs;
        size_t nElements;
};
如果添加或删除WrapperOne的成员,则

SimpleStruct的维护会容易得多。但是,假设我们要考虑大量SimpleStruct的集合:

// ... 
WrapperOne SSCollection1(10000000);
WrapperTwo SSCollection2(10000000);
// ...

如果两个类都已完全实现,则它们应该需要相同数量的内存(?)。但是,假设我们不需要查看所有A,B,C,E,而只需要例如AB。然后在WrapperTwo中,我们只需避免为C,E添加向量并节省内存。

在运行时是否有任何方法可以定义SimpleStruct可以使用的WrapperOne类的“子集”?还是我需要使WrapperOne成为模板类,然后定义一堆SimpleStruct变体,这些变体指定我可能想要收集的成员变量的不同组合?还是我会坚持使用WrapperTwo并根据自己的用例不断在代码行的注释/注释掉。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...