使用提升程序选项处理 2 级命令的最佳方法

Best way of handling level 2 commands with Boost ProgramOptions

本文关键字:命令 最佳 方法 处理 程序 选项      更新时间:2023-10-16

我有兴趣拥有一个在命令行上接受 2 级命令的可执行文件 - 有点像git commitgit add在一个 EXE 中是它们自己的独立命令。所以我的问题是:有没有办法用程序选项简化这一点?我知道我可以定义不同的方案,然后根据特定的字符串检查argv[1],但我希望有一种更干净的方法。谢谢!

您可以使用位置参数:

#include <boost/program_options.hpp>
#include <iostream>
#include <algorithm>
#include <iterator>
namespace po = boost::program_options;
// A helper function to simplify the main part.
template<class T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& v)
{
  copy(v.begin(), v.end(), std::ostream_iterator<T>(os, " "));
  return os;
}
int main(int ac, char* av[])
{
  try
    {
      po::options_description desc("Allowed options");
      desc.add_options()
        ("help", "produce help message")
        ("command", po::value<std::string>(), "command to execute")
        ("command_opt", po::value<std::vector<std::string> >(), "command options")
        ;
      po::positional_options_description p;
      p.add("command", 1);
      p.add("command_opt", -1);
      po::variables_map vm;
      po::store(po::command_line_parser(ac, av).
                options(desc).positional(p).run(), vm);
      po::notify(vm);
      if (vm.count("help")) {
        std::cout << "Usage: options_description [options]n";
        std::cout << desc;
        return 0;
      }
      if (vm.count("command"))
        {
          std::cout << "command: " << vm["command"].as<std::string>() << "n";
        }
      if (vm.count("command_opt"))
        {
          std::cout << "command options: " << vm["command_opt"].as<std::vector<std::string> >() << "n";
        }
    }
  catch(std::exception& e)
    {
      std::cout << e.what() << "n";
      return 1;
    }
}

但是 AFAIK 您必须自己对哪个选项与哪个其他选项兼容进行逻辑检查,因为提升程序选项中没有依赖系统。

按照此处所述将每个命令选项分组到不同的选项组中可能有助于生成的用法文本。