如何在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++中没有办法做到这一点。但是您仍然可以使用指针或使用预处理器宏。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 检查TCHAR数组输入是否为带符号整数C++
- 用符号版本替换对函数的所有调用
- 未解析的外部符号_MsiLocateComponentW@12.
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 如何在c++中动态调用属性名,就像JS中的方括号符号一样