假设我有一个对象,可以通过不同命名空间中的不同名称来识别:
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
数组来解决这个问题?
答案 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
};
在这种情况下,Objects
,id
和nameA
可以轻松索引nameB
。