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

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

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

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

0

Решение

Короткий ответ: никто не может сделать это в 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 класс показывает, как вы можете реализовать [] оператор себя.

1

Другие решения

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

Такие именованные ссылки почти полностью теряются и могут быть возвращены только с отладочными данными.

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

0

По вопросам рекламы [email protected]