提升程序选项相关选项

时间:2016-07-10 06:02:02

标签: c++ boost command-line-arguments boost-program-options

是否有任何方法可以使用boost::program_options使程序选项依赖于其他选项?

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

您可以考虑使用notify

来自https://theboostcpplibraries.com/boost.program_options#ex.program_options_01

#include <boost/program_options.hpp>
#include <iostream>

using namespace boost::program_options;

void on_age(int age)
{
  std::cout << "On age: " << age << '\n';
}

int main(int argc, const char *argv[])
{
  try
  {
    options_description desc{"Options"};
    desc.add_options()
      ("help,h", "Help screen")
      ("pi", value<float>()->default_value(3.14f), "Pi")
      ("age", value<int>()->notifier(on_age), "Age");

    variables_map vm;
    store(parse_command_line(argc, argv, desc), vm);
    notify(vm);

    if (vm.count("help"))
      std::cout << desc << '\n';
    else if (vm.count("age"))
      std::cout << "Age: " << vm["age"].as<int>() << '\n';
    else if (vm.count("pi"))
      std::cout << "Pi: " << vm["pi"].as<float>() << '\n';
  }
  catch (const error &ex)
  {
    std::cerr << ex.what() << '\n';
  }
}