如何通过Boost Program_Options使用命令行和分层配置文件的选项

问题描述 投票:0回答:1

想象我有一个采用以下命令行选项的程序:

$ 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.前缀。

所以,我的问题是,如果您使用分层配置文件选项,如何将它们与命令行选项关联?即如何使--fooprog1.foo在存储对象中表示相同的配置值?

c++ boost config command-line-arguments boost-program-options
1个回答
0
投票
我已经学到了足够多的知识来回答自己的问题。希望有一天会有帮助,因为Boost :: Program_Options文档不会涵盖此问题。

如果您创建像这样的分层配置选项(此

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 来访问值-只需使用引用的存储变量即可。

© www.soinside.com 2019 - 2024. All rights reserved.