【问题标题】:Boost Program Options dependent optionsBoost Program Options 相关选项
【发布时间】:2016-11-12 08:20:23
【问题描述】:
有没有办法使用boost::program_options 使程序选项依赖于其他选项?
例如,我的程序可以接受以下示例参数:
wifi --scan --interface=en0
wifi --scan --interface=en0 --ssid=network
wifi --do_something_else
在此示例中,interface 和 ssid 参数仅在它们伴随 scan 时才有效。它们依赖于 scan 参数。
有没有办法通过boost::program_options 自动执行此操作?它当然可以手动实现,但似乎必须有更好的方法。
【问题讨论】:
标签:
c++
boost
command-line-arguments
boost-program-options
【解决方案1】:
您可以定义两个依赖选项,只需定义一个小函数,如real.cpp 中所述。例如,您可以指定定义 option_dependency() 函数的两个依赖(或冲突)选项:
void option_dependency(const boost::program_options::variables_map & vm,
const std::string & for_what, const std::string & required_option)
{
if (vm.count(for_what) && !vm[for_what].defaulted())
if (vm.count(required_option) == 0 || vm[required_option].defaulted())
throw std::logic_error(std::string("Option '") + for_what
+ "' requires option '" + required_option + "'.");
}
然后调用
option_dependency (vm, "interface", "scan");
option_dependency (vm, "ssid", "scan");
就在boost::program_options::store()之后
注意option_dependency这个函数是单向的。在这种情况下,ssid 需要 scan 选项,但反之则不然。