我正在尝试使用boost :: multi_index创建一个URL管理对象。它有2个索引,每个路径项的一个索引位置和一个索引键来找到该项。
class InternalPath
{
public:
struct PathItem
{
int Position;
std::string Key;
std::string Path;
};
typedef boost::multi_index_container<
PathItem,
boost::multi_index::indexed_by<
boost::multi_index::ordered_unique<boost::multi_index::member<PathItem,int,&PathItem::Position>>,
boost::multi_index::ordered_unique<boost::multi_index::member<PathItem,std::string,&PathItem::Key>>
>
> PathContainer;
private:
PathContainer path_;
};
然而,存在一个问题,即并非所有物品都具有它的关键。大多数项目只包括位置和路径。我希望钥匙是独一无二的。现在当我插入多个非关键项时会出现问题。
是否可以允许带有空字符串的键在容器中有多个项目。如果不是我该怎么做才能克服这个问题?
答案 0 :(得分:2)
使用Boost.Variant稍微更优雅的解决方案:
struct PathItem
{
PathItem(int p,const std::string& k,const std::string& pt):
Position(p),Key(k),Path(pt){}
PathItem(int p,const std::string& pt):
Position(p),Key(p),Path(pt){}
int Position;
boost::variant<int,std::string> Key;
std::string Path;
};
答案 1 :(得分:1)
简短的回答是你不能这样做。作为一种快速的解决方法,考虑在没有密钥时提供一些唯一的字符串,例如一些特殊字符可防止与真实密钥冲突,后跟位置(假设是唯一的,对吧?):
struct PathItem
{
PathItem(int p,const std::string& k,const std::string& pt):
Position(p),Key(k),Path(pt){}
PathItem(int p,const std::string& pt):
Position(p),Key("!"),Path(pt){Key+=p;}
int Position;
std::string Key;
std::string Path;
};