Как динамически вызывать имена свойств в С++, например, в квадратных скобках в JS?

Мой первый язык — Javascript, но я начинаю изучать C++. Одна из моих любимых вещей — это доступ к свойствам с умными именами переменных свойств с использованием нотации квадратных скобок в Javascript, например:

var a = "prop";
var obj = {
  this.prop : "before"
};
function alterObj(a){
  obj[a] = "after";
}

Кажется, это не появляется в моих книгах по C++, и у меня возникают проблемы с поиском в Google. Так как же динамически выбирать имена свойств в C++?


person Brimby    schedule 30.05.2014    source источник
comment
Квадратная скобка с массивами или объектами. В javascript они одно и то же, потому что массивы ЯВЛЯЮТСЯ объектами, но во многих других языках это не так.   -  person Kevin B    schedule 30.05.2014
comment
@KevinB Я думаю, ты пропустил вопрос. Обозначение в квадратных скобках выглядит так: obj[method | property]. В других языках по моему опыту чаще всего используется точечная нотация obj.method. В котором также можно использовать JavaScript.   -  person Spencer Wieczorek    schedule 30.05.2014
comment
Я не был уверен, спрашивал ли он о arr[0] или о obj["toString"](). Оба обозначения в скобках   -  person Kevin B    schedule 30.05.2014
comment
Поскольку упоминается специфика JS. arr[0] практически стандартно используется во многих языках, не только в JavaScript.   -  person Spencer Wieczorek    schedule 30.05.2014
comment
Я полностью переформулировал свой вопрос с примером кода и конкретным фокусом.   -  person Brimby    schedule 31.05.2014
comment
Вопрос намного понятнее. Ответ - нет. Вы не можете вызывать такие имена свойств в C++. Вместо этого вы используете . или оператор -› (в зависимости от того, есть ли у вас указатель или нет).   -  person BradleyDotNET    schedule 31.05.2014
comment
Часть того, что делает C++ намного быстрее, чем JavaScript, заключается в том, что он не позволяет вам делать подобные вещи (хотя, конечно, вы можете использовать карты для достижения этого там, где это действительно необходимо), но обычные структуры и классы имеют свой член имена преобразуются в байтовые смещения во время компиляции, поэтому информация просто недоступна во время выполнения. Это также дает вам строгую проверку типов, выявляя больше ошибок во время компиляции. Короче говоря: вам придется научиться писать более дисциплинированно, если вы хотите продвинуться дальше в C++.   -  person Dave    schedule 31.05.2014


Ответы (2)


Короткий ответ: на С++ этого сделать нельзя. Основное различие между c++ и javascript заключается в том, что c++ является компилируемым языком, а javascript — нет. Javascript имеет множество удобных функций времени выполнения, которые вы можете использовать, т. е. вы можете использовать нотацию скобок для доступа к свойствам.

obj["property"]

Это позволяет помещать в скобки любую строку, а затем оценивать ее во время выполнения. С++, однако, не имеет такой большой среды выполнения (существует очень мощная среда выполнения, но мощная по-другому).

Теперь, после всего сказанного, если вы хотите реализовать функцию, подобную вашей 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 показывает, как вы можете реализовать оператор [] самостоятельно.

person DanZimm    schedule 30.05.2014

C++ — компилируемый язык. Большинство имен классов, переменных, свойств, перечислений и функций не попадают в окончательный двоичный файл, они обрабатываются во время компиляции и транслируются в смещения памяти до финального машинный код для использования.

Такие именованные ссылки почти полностью теряются, и их можно отследить только с помощью данных отладки.

Короче говоря, вы не можете сделать это на C или C++. Но вы все еще можете работать с указателями или использовать макросы препроцессора.

person Havenard    schedule 30.05.2014