如何在c++中动态调用属性名,就像JS中的方括号符号一样

How to dynamically call property names in C++ like square bracket notation in JS?

本文关键字:符号 方括号 JS 一样 c++ 动态 调用 属性 就像      更新时间:2023-09-26

我的第一门语言是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++中没有办法做到这一点。但是您仍然可以使用指针或使用预处理器宏。