javascript - 如何像JS中的方括号表示法一样动态调用C++中的属性名称?

标签 javascript c++ square-bracket

我的第一语言是 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/

相关文章:

c++ - 异步是否总是在 C++ 中使用另一个线程/核心/进程?

c++ - 如何将 C++ STL vector 迭代器转换为 vector 反向迭代器?

objective-c - Objective-C 中的 [myString length] 和 myString.length 有什么区别?

c++ - 奇怪的 C++ 语法

javascript - 在 PrimeNG 中扩展多个面板时如何修复损坏?

javascript - Google Firebase 错误(函数返回未定义、预期的 Promise 或值)

c++ - Libtiff 的 TIFFOpenW 抛出异常

javascript - 主干 View 继承

javascript - highcharts 覆盖 addEvent 函数