想象我有一个采用以下命令行选项的程序:
$ prog1 --foo 1
我还有一个采用这种分层格式的配置文件,其foo
参数在prog1
范围内:
[prog1]
foo = 42
我对Boost :: program_options的理解是,命令行选项的定义类似于:
description.add_options()
("foo", "Set foo value");
但是我希望配置文件中的值是默认值(作为两次调用store()
的结果,首先使用命令行描述,然后使用配置文件描述),可以被命令覆盖-行选项,但我认为配置文件选项必须声明为:
description.add_options()
("prog1.foo", "Set foo value");
请注意此处使用prog1.foo
,尤其是prog1.
前缀。
所以,我的问题是,如果您使用分层配置文件选项,如何将它们与命令行选项关联?即如何使--foo
和prog1.foo
在存储对象中表示相同的配置值?
如果您创建像这样的分层配置选项(此
is已记录):
config_only_opts.add_options()
("section.option", po::bool_switch(), "Some option");
并将其传递给parse_command_line()
和parse_config_file()
。然后配置文件将如下所示:
[section] option=1
并且命令行选项将如下所示(这已记录在[[not中:]]
--section.option
因此,分层选项转换为点分的命令行选项。因此,我希望这样:
[one.two]
three=4
等同于以下配置选项:
--one.two.three=4
应用于命令行或配置文件选项的默认设置将按照您期望的方式应用,具体取决于调用store()
的顺序。
[如果要将任意命令行选项(例如现在您可以使用--foo
)与层次结构(或平面)配置文件值(例如bar.baz
)关联,则可以将前者注册为parse_command_line()
,而后者注册为[ C0],但为每个引用same存储变量:
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
设置此变量。唯一需要注意的警告是,您不能再使用[XXX]为“ foo”或“ bar.baz”的[bar]
baz=X
来访问值-只需使用引用的存储变量即可。