Проблема в том, что карта переменных запоминает, какие параметры являются окончательными.
Если вы посмотрите на источник, вы найдете следующую запись.
/** 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;