Как уже было сказано, вы ищете отражение в C++. В нем этого нет, и этот ответ объясняет почему.
Вы можете использовать ассоциативный контейнер в виде std::map< std::string, your_variable_type > для связи строки с переменной, предполагая, что все они одного типа.
Если у вас переменные разных типов, существует решение, как в boost::variant
C++ адресует все переменные по адресу, поэтому нет возможности просто сказать valueOf переменной (языки, которые позволяют это, например, python, perl, имеют среду выполнения, хранящую эту информацию)
Вы можете реализовать что-то, позволяющее использовать имя для поиска значения, храня значения и их имена в std::map.
Как уже было сказано, C ++ не обеспечивает отражения. Но вы можете использовать некоторое сопоставление ключей и значений по своему усмотрению. Когда требуется только один тип значения (например, int), вы можете использовать ассоциативный контейнер (карту) STL из коробки. Если вам нужно поддерживать несколько типов значений, я рекомендую изучить библиотеку Boosts Variant .
Ну, если вы действительно хотите сделать что-то подобное, вы можете попробовать использовать std::map (map< string, int* > ). Hovewer ограничит вас одним типом переменной, если только вы не вдадитесь в какую-нибудь уродливую магию указателей. В любом случае это будет уродливо, и поверьте мне, вы не захотите идти по этому пути. Зачем вообще нужна такая возможность? Если для отладки, то используйте отладчик.
Нет, не с помощью C++ или его стандартной библиотеки. Конечно, вы можете что-нибудь придумать, чтобы эмулировать такое поведение. C++ позволяет вам выбирать методы во время выполнения, используя полиморфизм, так что вы можете воспользоваться этим. По сути, вы получите метод для вызова во время выполнения, а не переменную, и метод вернет значение:
struct Value {
virtual ~Value();
virtual std::string value() const = 0;
};
struct Counter : public Value {
int v;
std::string value() const {
istringstream ss(v);
return ss.str();
}
};
struct Mounter : public Value {
double v;
std::string value() const {
istringstream ss(v);
return ss.str();
}
};
Value* get_value();
// ...
cout << get_value()->value() << endl;
В качестве альтернативы вы можете вести карту с ключами на строках, именах значений, а затем искать значения по их именам.
Для этого нужно что-то вроде reflection или eval, которых в C++ нет.
Нет, C++ не предоставляет таких возможностей. Возможно, вы сможете что-то придумать с помощью макросов (или других хитростей), но это, скорее всего, будет довольно уродливо.
Поскольку я не могу придумать ни одной веской причины, почему это может быть полезно, возможно, вы могли бы просветить нас. Когда что-то не может быть сделано определенным образом, часто полезно вернуться к базовым требованиям и посмотреть, есть ли другой способ.