Значение переменной доступа с помощью строки, представляющей имя переменной в C++ [дубликат]

9
задан Paul Ridgway 26 May 2010 в 19:25
поделиться

8 ответов

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

10
ответ дан 4 December 2019 в 10:03
поделиться

Вы можете использовать ассоциативный контейнер в виде std::map< std::string, your_variable_type > для связи строки с переменной, предполагая, что все они одного типа.

Если у вас переменные разных типов, существует решение, как в boost::variant

5
ответ дан 4 December 2019 в 10:03
поделиться

C++ адресует все переменные по адресу, поэтому нет возможности просто сказать valueOf переменной (языки, которые позволяют это, например, python, perl, имеют среду выполнения, хранящую эту информацию)

Вы можете реализовать что-то, позволяющее использовать имя для поиска значения, храня значения и их имена в std::map.

1
ответ дан 4 December 2019 в 10:03
поделиться

Как уже было сказано, C ++ не обеспечивает отражения. Но вы можете использовать некоторое сопоставление ключей и значений по своему усмотрению. Когда требуется только один тип значения (например, int), вы можете использовать ассоциативный контейнер (карту) STL из коробки. Если вам нужно поддерживать несколько типов значений, я рекомендую изучить библиотеку Boosts Variant .

1
ответ дан 4 December 2019 в 10:03
поделиться

Ну, если вы действительно хотите сделать что-то подобное, вы можете попробовать использовать std::map (map< string, int* > ). Hovewer ограничит вас одним типом переменной, если только вы не вдадитесь в какую-нибудь уродливую магию указателей. В любом случае это будет уродливо, и поверьте мне, вы не захотите идти по этому пути. Зачем вообще нужна такая возможность? Если для отладки, то используйте отладчик.

1
ответ дан 4 December 2019 в 10:03
поделиться

Нет, не с помощью 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;

В качестве альтернативы вы можете вести карту с ключами на строках, именах значений, а затем искать значения по их именам.

3
ответ дан 4 December 2019 в 10:03
поделиться

Для этого нужно что-то вроде reflection или eval, которых в C++ нет.

0
ответ дан 4 December 2019 в 10:03
поделиться

Нет, C++ не предоставляет таких возможностей. Возможно, вы сможете что-то придумать с помощью макросов (или других хитростей), но это, скорее всего, будет довольно уродливо.

Поскольку я не могу придумать ни одной веской причины, почему это может быть полезно, возможно, вы могли бы просветить нас. Когда что-то не может быть сделано определенным образом, часто полезно вернуться к базовым требованиям и посмотреть, есть ли другой способ.

0
ответ дан 4 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: