如何在c++中动态调用属性名,就像JS中的方括号符号一样
How to dynamically call property names in C++ like square bracket notation in JS?
我的第一门语言是Javascript,但我开始学习c++。我最喜欢做的一件事是使用Javascript中的方括号符号访问具有聪明变量属性名的属性,如下所示:
var a = "prop";
var obj = {
this.prop : "before"
};
function alterObj(a){
obj[a] = "after";
}
它似乎没有出现在我的c++书中,我在谷歌上搜索它时遇到了麻烦。那么如何在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
类显示了您如何自己实现[]
操作符。
c++是一种编译语言。大多数类、变量、属性、枚举和函数的名称都不会进入最终的二进制文件,它们在编译时被处理并转换成内存偏移量以供最终机器代码使用。
这样的命名引用几乎是完全丢失的,只能用调试数据进行回溯。
长话短说,在C或c++中没有办法做到这一点。但是您仍然可以使用指针或使用预处理器宏。
相关文章:
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- 在.csv文件中写入学位符号
- 使用相同的数据集绘制各种符号
- 将带点符号的属性(有时)传递给函数
- RegEx JavaScript:数字后的符号提取
- 使用方括号访问插件原型函数
- 如何在计算器符号为零时替换它
- 删除输入中输入的符号
- 如何在ReactJs中渲染重音符号
- 如何替换JavaScript字符串中除字母和数字之外的所有内容(空格/符号)
- 在javascript中使用方括号表示法的嵌套对象
- 插入符号到底是什么
- 删除图形和数字之间的连字符(-)符号
- 将方括号符号转换为对象
- 模板字符串中的美元符号后跟方括号
- JavaScript和方括号符号
- Javascript方括号符号多个动态属性
- 如何在c++中动态调用属性名,就像JS中的方括号符号一样
- 对象访问符号:方括号(Javascript)
- JavaScript中使用方括号符号的嵌套对象