Я выучил достаточно, чтобы ответить на свой вопрос. Надеемся, что однажды это кому-нибудь поможет, потому что документация Boost :: Program_Options не покрывает это.
Если вы создаете параметр иерархической конфигурации, подобный этому (это задокументировано ):
config_only_opts.add_options()
("section.option", po::bool_switch(), "Some option");
И передать его как parse_command_line()
, так и parse_config_file()
.
Тогда файл конфигурации будет выглядеть следующим образом:
[section]
option=1
И параметр командной строки будетвыглядеть следующим образом (это не задокументировано):
--section.option
Таким образом, иерархические параметры преобразуются в пунктирные параметры командной строки. Поэтому я ожидал бы, что:
[one.two]
three=4
будет эквивалентен следующей опции конфигурации:
--one.two.three=4
Значения по умолчанию, которые применяются к параметрам командной строки или файла конфигурации, применяются вв зависимости от порядка вызова store()
.
Если вы хотите связать произвольный параметр командной строки, например --foo
, с иерархическим (или плоским) файлом конфигурациизначение, например bar.baz
, тогда вы можете зарегистрировать первое с помощью parse_command_line()
, а второе - с parse_config_file()
, но для каждого из них укажите одинаковую переменную хранения:
bool foo;
po::options_description cmdline_opts;
cmdline_only_opts.add_options()
("foo", po::value<bool>(&foo), "Foo")
;
po::options_description config_file_opts;
config_only_opts.add_options()
("bar.baz", po::value<bool>(&foo))
;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, cmdline_opts), vm);
po::store(po::parse_config_file("config.file", config_file_opts, true /* allow unregistered */), vm);
po::notify(vm);
Теперь выможно использовать --foo
или
[bar]
baz=X
для установки переменной foo
. Единственное предостережение, о котором следует быть осторожным, это то, что вы больше не можете использовать vm[XXX].as<T>()
, где «XXX» - это «foo» или «bar.baz» для доступа к значению - просто используйте вместо этого указанную переменную хранилища.