C++;[]映射,可能通过模板 我在C++中有一个小问题,我不知道如何解决。 问题的第一部分是通过[]访问结构中的元素,或者更好地将[]映射到子元素

C++;[]映射,可能通过模板 我在C++中有一个小问题,我不知道如何解决。 问题的第一部分是通过[]访问结构中的元素,或者更好地将[]映射到子元素,c++,templates,struct,operator-overloading,dynamic-data,C++,Templates,Struct,Operator Overloading,Dynamic Data,我的结构如下所示: struct e { std::string content; std::string name; std::map<std::string, std::vector<e> > elements; }; struct e{ std::字符串内容; std::字符串名; 地图元素; }; 如果我想访问e的一个子元素,我可以这样做:e.elements[“e1”][0]。elements[“e1sub”][0]。content,

我的结构如下所示:

struct e {
    std::string content;
    std::string name;
    std::map<std::string, std::vector<e> > elements;
};
struct e{
std::字符串内容;
std::字符串名;
地图元素;
};
如果我想访问e的一个子元素,我可以这样做:
e.elements[“e1”][0]。elements[“e1sub”][0]。content
,是否可以映射它,这样我就可以这样称呼它:
e[“e1”][0]
,这只意味着他必须用e.elements[]来“替换”每一个e[]

也许这可以用模板来完成,但是我不知道如何使用它们,因为我刚开始学习C++。
提前感谢您的帮助,罗宾。

您需要超载
操作员[]
。通常,您希望实现该运算符的两个版本,但由于
std::map
只重载非
const
版本,因此这可能就足够了

类似于以下的操作应该可以做到:

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];}
};
struct e{
std::字符串内容;
std::字符串名;
地图元素;
std::vector和操作符[](const std::string和key){返回元素[key];}
};
您可以“重载”[]运算符,请尝试:

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];
}
struct e{
std::字符串内容;
std::字符串名;
地图元素;
std::vector&operator[](const std::string&s);
};
...
std::vector&e::operator[](const std::string&s){
返回元素;
}

您不需要模板。您只需要一个
操作符[]

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]; }
std::vector&e::operator[](std::string const&s){返回此->元素[s];}
//如果元素还不存在,运算符[s]将插入。这是非常量,所以下面的方法不起作用
//std::vector const&e::operator[](std::string const&s)const{return this->elements[s];}

const的
版本必须比
std::map的版本更加复杂。此外,实现它还将面临同样的问题,导致
std::map
没有
const
重载
操作符[]()
。你还需要升级你的漏油卡盘<代码>:)
1)你没有将你的评论答案归为属性,我只是偶然来到这里。2) 我不知道“ofc”代表什么。@sbi:我没有对评论进行属性化,因为它不是回应。我为其他读者添加了一条评论,这样他们就不会误以为您的评论适用于最新的代码。“OFC”代表“当然”,我认为这是一个常见的缩写。这是一个很好的答案,但是如果你正在重载操作符,也许是时候把数据放到一个真实的类中了?C++中绝对不需要<代码> TyPufFrasee{{}}e;<代码>-这仅在C中是必需的。
向量在
结构e
中是否在技术上是非法的(向量类型不完整,但取决于实现细节,您可以侥幸逃脱)?除了下面给出的所有建议之外,建议将
元素
设为私有/受保护的成员