我的第一语言是 Javascript,但我开始学习 C++。我最喜欢做的事情之一是使用 Javascript 中的方括号表示法通过巧妙的变量属性名称访问属性,如下所示:
var a = "prop";
var obj = {
this.prop : "before"
};
function alterObj(a){
obj[a] = "after";
}
它似乎没有出现在我的 C++ 书籍中,而且我在 Google 上搜索它时遇到了麻烦。那么如何在 C++ 中动态选择属性名称呢?
最佳答案
简短的回答是在 C++ 中无法做到这一点。 c++ 和 javascript 之间的主要区别在于 c++ 是编译语言,而 javascript 不是。 Javascript 有许多简洁的运行时功能可供您使用,即您可以使用括号表示法来访问属性
obj["property"]
这允许将任何类型的字符串放置在括号中,然后在运行时进行评估。然而,C++ 没有那么大的运行时(有一个非常强大的运行时,但以不同的方式强大)。
综上所述,如果您想实现像上面的 alterObj
这样的函数,您可以使用 map
类。您还可以重载 []
运算符。以下代码片段给出了一个示例:
#include <iostream>
#include <map>
class SpecialObject {
public:
std::string operator[](std::string key);
};
std::string SpecialObject::operator[](std::string key) {
std::string retVal = key + " whoa!";
return retVal;
}
void modify(std::map<std::string, std::string> &obj) {
obj["something"] = "someone else";
}
int main(int argc, const char *argv[]) {
std::map<std::string, std::string> obj;
obj["something"] = "someone";
modify(obj);
std::cout << "obj[\"something\"] = " << obj["something"] << std::endl;
SpecialObject obj2;
std::cout << "obj2[\"The clowns say\"] = " << obj2["The clowns say"] << std::endl;
return 0;
}
map
对象允许您为其他对象创建一个简单的容器(在某种意义上与 javascript 对象完全相同),SpecialObject
类显示了如何实现您自己的 []
运算符。
关于javascript - 如何像JS中的方括号表示法一样动态调用C++中的属性名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23962070/