来自同一对象的boost :: multi_index多个键

时间:2014-09-11 21:10:35

标签: c++ boost

假设我有一个对象,可以通过不同命名空间中的不同名称来识别:

enum Namespace {
    nspaceA,
    nspaceB
};

struct Object {
    int id;
    std::map<Namespace, std::string> names;
};

现在我想在Object中存储boost::multi_index的实例,并且能够通过唯一ID以及命名空间/符号对查找对象:

array.find( boost::make_tuple( nspaceA, "foobar" ) );

因此候选者将是一个复合键,并且据我所知,一个对象只能代表一个键。但是一个Object实例在不同的名称空间中具有名称。有没有办法用boost::multi_index数组来解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以在容器中存储多个对象,其中每个对象都引用您要存储的原始对象。

因此,例如,如果你有一个类型为Foo的对象可以被几个不同的键引用,其中每个键是一个名称空间+名称对,那么你可以存储类型为

的对象
struct Key {
  Namespace namespace;
  std::string name;
  std::shared_ptr<Foo> object;
};

而不是直接存储Foo对象。

更新(问题更新后): 如果您需要以其他方式查找对象(例如id),那么您将需要使索引非唯一或将对象存储在辅助容器中。

另一种选择可能是将命名空间分隔到容器上的不同索引中,这当然也不适用于所有场景。

答案 1 :(得分:0)

考虑到Namespace只有两个值,你最好不要这样定义Object吗?

struct Object {
    int id;
    std::string nameA,nameB; // potentially empty
};

在这种情况下,ObjectsidnameA可以轻松索引nameB