Я пытаюсь создать объект управления URL с помощью boost :: multi_index. У него есть 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_;
};
Однако есть проблема, что не у всех предметов есть ключ. Большинство предметов будет состоять только из позиции и пути. Я хочу, чтобы ключ был уникальным. Теперь проблема возникнет, когда я вставлю более одного не ключевого элемента.
Можно ли разрешить ключу с пустой строкой иметь более одного элемента в контейнере. Если нет, что я должен сделать, чтобы преодолеть эту проблему?
Несколько более элегантное решение с использованием 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;
};
Короткий ответ: ты не можешь этого сделать. В качестве быстрого обходного пути рассмотрите возможность предоставления некоторой уникальной строки, когда ключа нет, например, специального символа, который предотвращает столкновение с реальными ключами, за которыми следует позиция (которая предполагается уникальной, верно?):
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;
};