【问题标题】: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

在此示例中,interfacessid 参数仅在它们伴随 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 选项,但反之则不然。

【讨论】:

    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2012-07-30
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多