我有一个应用程序,可以分两个步骤加载选项。在第二步中,options_description
对象中可能未声明某些选项(取决于第一步中传递的选项)。
似乎没有选择忽略未声明的选项,类似于解析command line arguments和configuration files时存在的选项。
一个最小的工作示例:
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main() {
int opt1;
po::options_description options("my app options");
options.add_options()
("opt1", po::value<int>(&opt1)->default_value(0), "option 1");
po::variables_map env;
po::store(po::parse_environment(options, "MYAPP_"), env);
po::notify(env);
printf("opt1: %d\n", opt1);
return 0;
}
默认情况下,您将得到零值,如预期:
$ ./a.out
opt1: 0
如果您设置MYAPP_OPT1
,它也可以按预期工作
$ MYAPP_OPT1=123 ./a.out
opt1: 123
但是,如果设置了配置文件中未指定的变量,它将崩溃。
$ MYAPP_UNDEFINED=456 ./a.out
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::program_options::unknown_option> >'
what(): unrecognised option
Aborted (core dumped)
还有另外一件烦人的事情-如果不是声明"opt1"
而是声明"OPT1"
,而是什至无法识别MYAPP_OPT1
!
答案 0 :(得分:0)
恕我直言,这将是对boost库的一个不错的添加,使其与命令行和配置文件解析器相当。
以下内容改编自my gist。
使用Boost的program_options加载环境变量时,无法告诉boost忽略options_description
对象中未指定的变量。
此代码段显示如何获得与命令行和配置文件解析器可用的allow_unregistered()
选项类似的行为。
例如,如果您尝试通过指定名为MYAPP_ONE
的选项并在one
中使用前缀MYAPP
来读取parse_environment
,它将很好用。
如果MYAPP_X
对象中未包含另一个options_description
,则会出现问题。然后将引发异常。
如果使用程序参数(argc
,argv
)或配置文件,则库中有一个选项可以简单地忽略{{1}中未声明的选项}。
对于环境变量,情况并非如此。该代码段将仅读取您声明的选项,而忽略其他可能已声明的选项。
因此,其行为类似于options_description
功能。
allow_unregistered()