提升计划选项依赖选项



有没有办法使用 boost::program_options 使程序选项依赖于其他选项?

例如,我的程序可以接受以下示例参数:

wifi --scan --interface=en0
wifi --scan --interface=en0 --ssid=network
wifi --do_something_else

在此示例中,interfacessid 参数仅在附带 scan 时才有效。它们依赖于scan参数。

有没有办法用boost::program_options自动强制执行?它当然可以手动实现,但似乎必须有更好的方法。

您可以定义两个依赖选项,只需定义一个小函数,如实际.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选项,但不是相反。

最新更新