ИМХО, это было бы хорошим дополнением к библиотеке буста, сделав его наравне с парсерами командной строки и файла конфигурации.
Следующее адаптировано из my gist .
При использовании программных_опций Boost для загрузки переменных окружения нельзя сказать, чтобы boost игнорировал те, которые не были указаны в объекте options_description
.
В этом фрагменте показано, какчтобы получить поведение, аналогичное параметру allow_unregistered()
, доступному для парсера командной строки и файла конфигурации.
Например, если вы попытаетесь прочитать MYAPP_ONE
, указав параметр с именем one
и используя префикс MYAPP
в parse_environment
все будет работать нормально.
Проблема возникает, если есть еще один MYAPP_X
, который не был включен в объект options_description
.Тогда будет выдано исключение.
Если вы используете аргументы программы (argc
, argv
) или файл конфигурации, в библиотеке есть опция, позволяющая просто игнорировать опции, которые не были объявленыв options_description
.
Для переменных окружения это не так.Этот фрагмент будет просто читать объявленные вами параметры и игнорировать любые другие, которые могли быть объявлены.
Таким образом, он ведет себя как функциональность allow_unregistered()
.
po::options_description options("My Options");
lib_options.add_options()
(
"MY_VAR",
po::value<bool>(&my_var)->default_value(false),
"Dummy boolean test"
)
;
po::variables_map env;
po::store(po::parse_environment(
options,
[options](const std::string& var) {
return std::any_of(
options.options().cbegin(),
options.options().cend(),
[var](auto opt) { return var == opt->long_name(); }) ? var : "";
}), env);
po::notify(env);