容器结构,用于包含作为标识符的类

Container structure for class containing a class acting as an identifier

本文关键字:标识符 包含作 用于 结构      更新时间:2023-10-16

对于以下一组类

class Identifier; // can be used as a key
class Data;
class MoreData;
class Object {
  Identifier id_;
  Data data_;
  MoreData moreData_;
};

对于Object类数据库的数据存储,什么是好的设计?有试过

std::set<Object>

这保持了Object类抽象的封装,但是使用Identifier成员进行操作(例如,查找、插入等)的行为是笨拙的。有试过

std::map<Identifier, std::pair<Data, MoreData>>

使用Identifier作为键的语义要自然得多,但这破坏了Object类的封装,操作需要从各个部分构造Object实例。

这里是否有更好的选择,不受上述方法的任何缺点的影响(或减轻它们)?没有什么是一成不变的,所以重构对象或添加方法等都是值得赞赏的回应。如果没有更好的标准,Boost也可以。

您可能想看看Boost。Multi-Index,允许指定Object::id_作为键。比如:

boost::multi_index_container<
    Object,
    boost::multi_index::indexed_by<
        boost::multi_index::ordered_unique<
            boost::multi_index::member<Object, Identifier, &Object::id_>
        >   
    >   
>;