Как вручную вставить параметры в boost.Program_options?

У меня есть приложение, которое использует Boost.Program_options для хранения параметров конфигурации и управления ими. В настоящее время мы отказываемся от файлов конфигурации и вместо этого используем конфигурацию, загружаемую из базы данных. Я написал API, который считывает параметры конфигурации из базы данных по имени хоста и имени экземпляра. (круто!) Однако, насколько я понимаю, нет возможности вручную вставить эти параметры в файл boost Program_options. Кто-нибудь использовал это раньше, есть идеи? Документы из boost, похоже, указывают, что единственный способ получить данные на этой карте — это функция хранилища, которая либо считывается из командной строки, либо из файла конфигурации (не то, что я хочу). В основном ищем способ вручную вставить значения чтения БД на карту.


person Alex    schedule 08.05.2009    source источник
comment
Я не нашел хорошего способа сделать это, кроме форматирования char **, как если бы это был параметр командной строки. Если кто-то найдет что-то, дайте мне знать!   -  person Alex    schedule 21.05.2009


Ответы (2)


Мой ответ приходит слишком поздно, но я потратил некоторое время, пытаясь сделать что-то подобное, и нашел раздражающе очевидное решение (если кто-то еще ищет это)...

Вспоминая, что boost::program_options::variables_map происходит от std::map<std::string, boost::program_options::variable_value>, вы можете выполнять совершенно законную обработку карты STL, включая вставку...

namespace po = boost::program_options;
po::variables_map vm;
vm.insert(std::make_pair("MyNewEmptyOption", po::variable_value());
vm.insert(std::make_pair("MyNewIntOption", po::variable_value(32, false));
po::notify(vm);

-Эдмонд-

person Edmond Begumisa    schedule 22.04.2010
comment
Мне не кажется, что program_options наследуется от std::map. Я вижу, что это получено из: abstract_variables_map. Еще не проверял, является ли это переработанным std::map. - person Alex; 22.04.2010
comment
@Alex, он наследуется от обоих. - person russoue; 25.04.2014
comment
Хороший! Любопытно, почему vm["MyNewIntOption"] = po::variable_value(32, false); не сработало, когда я попробовал это? Есть кое-что об отбрасывании квалификатора const. - person Claudiu; 08.08.2014
comment
Я думаю, что в вашем примере отсутствует вызов store. Не могли бы вы включить это, пожалуйста? - person quant; 14.06.2016

Вы смотрели на extra_parser или allow_unregistered функции Boost::Program_Options? В зависимости от того, как именно работает ваша программа, одна или обе из них должны поддерживать то, что вы хотите.

person Head Geek    schedule 11.05.2009