boost :: program_options как перезагрузить значение - PullRequest
5 голосов
/ 04 декабря 2011

Я хотел бы перезагрузить некоторые значения из файла конфигурации.Я знаю, что po::store не изменит значения, если они существуют в variables_map.Есть ли альтернатива, которая заменяет значения, даже если они уже существуют?

Я попытался удалить значения, которые я собираюсь перезагрузить из variables_map, но po::store не добавляет новые значения в любом случае (хотястарые тоже не доступны).

Ответы [ 2 ]

6 голосов
/ 24 ноября 2014

Решение P3trus включает в себя снижение.Это необходимо, поскольку variables_map перегружает std::map::operator[], возвращая const variable_value & ( const предотвращает переназначения).

Однако в C ++ 11 у нас есть std::map::at(), который неперегружен, так что можно сделать:

vm.at(option).value() = val;

прямо там, где нужно.

5 голосов
/ 10 декабря 2011

Проблема в том, что карта переменных запоминает, какие параметры являются окончательными. Если вы посмотрите на источник, вы найдете следующую запись.

/** Names of option with 'final' values -- which should not
    be changed by subsequence assignments. */
std::set<std::string> m_final;

Это закрытая переменная-член переменной_карты.

Полагаю, самым простым способом было бы использовать новую переменную_карту и заменить старую. Если вам нужны некоторые из старых значений или вы просто хотите заменить некоторые из них, напишите собственную функцию store. Вы в основном создаете временную переменную_карты с помощью po :: store, а затем обновляете свою переменную_карты так, как вам нужно.

variable_map в основном представляет собой std :: map, поэтому вы можете получить доступ к его содержимому таким же образом. Он хранит po :: variable_value, своего рода обертку вокруг boost :: any объекта. Если вы просто хотите заменить одно значение, вы можете использовать что-то подобное

template<class T>
void replace(  std::map<std::string, po::variable_value>& vm, const std::string& opt, const T& val)
{
  vm[option].value() = boost::any(val);
}

Примечание: po - псевдоним пространства имен.

namespace po = boost::program_options;
...