Отображение C ++ [], возможно, через шаблоны - PullRequest
2 голосов
/ 10 сентября 2010

У меня маленькая проблема в C ++, я не знаю, как ее решить. Первая часть проблемы заключается в доступе к элементу в структуре с помощью [] или, что лучше, для отображения [] на подэлемент.

Моя структура выглядит так:

struct e {
    std::string content;
    std::string name;
    std::map<std::string, std::vector<e> > elements;
};

Если я хочу получить доступ к подэлементу e, я могу сделать это следующим образом: e.elements["e1"][0].elements["e1sub"][0].content, можно ли отобразить это так, чтобы я мог назвать его так: e["e1"][0]["e1sub"][0], это будет означать, что у него есть «заменить» каждый e [] на e.elements [].

Может быть, это можно сделать с помощью шаблонов, но я пока не знаю, как их использовать, так как я только начинаю изучать C ++.

Заранее благодарен за любую помощь, Робин.

Ответы [ 3 ]

4 голосов
/ 10 сентября 2010

Вам нужно перегрузить operator[]. Как правило, вы хотите реализовать две версии этого оператора, но поскольку std::map перегружает только не-1003 * версию, этого может быть достаточно для вас.

Что-то вроде следующего должно сделать:

struct e {
    std::string content;
    std::string name;
    std::map<std::string, std::vector<e> > elements;

    std::vector<e>& operator[](const std::string& key) {return elements[key];}
};
2 голосов
/ 10 сентября 2010

Вы можете «перегрузить» оператор [], попробуйте:

struct e {
    std::string content;
    std::string name;
    std::map<std::string, std::vector<e> > elements;
    std::vector<e>& operator [](const std::string& s);
};

...

std::vector<e>& e::operator [](const std::string& s) {
    return elements[s];
}
1 голос
/ 10 сентября 2010

Вам не нужны шаблоны. Вам просто нужно operator[]:

std::vector<e>& e::operator[](std::string const& s) { return this->elements[s]; }
// elements.operator[s] inserts s if it doesn't exist yet. That's non-const so the following won't work
// std::vector<e> const& e::operator[](std::string const& s) const { return this->elements[s]; }
...