C++ boost::multi_索引来自同一对象的多个键

C++ boost::multi_索引来自同一对象的多个键,c++,boost,C++,Boost,假设我有一个对象,可以通过来自不同名称空间的不同名称来识别: enum Namespace { nspaceA, nspaceB }; struct Object { int id; std::map<Namespace, std::string> names; }; 所以候选者是一个复合键,据我所知,一个对象只能代表一个键。但是一个对象实例的名称在不同的名称空间中。有没有办法用boost::multi_indexarray解决这个问题?您可以在容

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

enum Namespace {
    nspaceA,
    nspaceB
};

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

所以候选者是一个复合键,据我所知,一个对象只能代表一个键。但是一个
对象
实例的名称在不同的名称空间中。有没有办法用
boost::multi_index
array解决这个问题?

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

例如,如果您有一个Foo类型的对象,它可以被几个不同的键引用,其中每个键都是一个名称空间+名称对,那么您就可以实例存储Foo类型的对象

struct Key {
  Namespace namespace;
  std::string name;
  std::shared_ptr<Foo> object;
};
struct键{
名称空间;
std::字符串名;
std::共享的ptr对象;
};
而不是直接存储Foo对象

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


另一种选择是在容器上将名称空间分隔为不同的索引,当然这也不适用于所有情况。

考虑到
名称空间
只有两个值,您是否最好这样定义
对象

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

在这种情况下,
对象
可以通过
id
nameA
nameB
轻松索引这是显而易见的,存储指向同一对象的多个指针,但我不能使用其他键,如unique id,让我修改questionNo,这是真的,但是您可以将对象本身存储在其他位置。然后我需要手动保持两个容器的同步,这是我想要避免的,这就是为什么我尝试使用
boost::multi_index
。因此,恐怕这不是一个解决方案,我可能会误解,但在我看来,如果您对id字段使用非唯一索引,您将不需要手动保持同步?非唯一索引一方面会中断数据验证,另一方面我必须在插入时手动添加多个索引。它给我的唯一好处是一次删除数据。我担心失去拥有唯一指数的能力,代价太大了。但是,让我们把它算作一个局部解决方案。它们可能是整个名称空间中名称之间的冲突吗?那么
nspaceA
上的“foobar”是否可以引用与
nspaceB
上的“foobar”不同的对象?如果没有,那么您可以使用
boost::multi_index
来实现这一点,但如果是这样的话……可能不会,但我不能保证这一点,我更愿意维护单独的容器,而不是依赖它。@Chad同一个对象在不同的名称空间中肯定有相同的名称,所以我想这无论如何都会破坏它。这不是真正的代码,而是最小的示例。奇怪的是,你从中推断出需求。换句话说,如果
名称
映射中不同键的数目N很小(假设并使用开关按名称空间/名称组合查找对象?顺便说一句,要创建N个索引,我不必将
映射
转换为数据成员。不是
开关
,而是对所有索引进行线性扫描。是的,不需要删除
映射
即可完成此操作。正如我在问题中所说的,我需要按名称空间/名称c查找对象。)ombination(有一个例子)。如果没有开关和线性扫描,我怎么做呢?
struct Object {
    int id;
    std::string nameA,nameB; // potentially empty
};