Лучший способ обработки команд уровня 2 с помощью Boost ProgramOptions

Мне интересно иметь один исполняемый файл, который принимает команды уровня 2 в командной строке - вроде как git commit а также git add их собственные отдельные команды в одном EXE. Итак, мой вопрос: есть ли способ упростить это с помощью ProgramOptions? Я знаю, что могу определить различные схемы, а затем проверить argv[1] против конкретной строки, но я надеюсь, что есть более чистый способ. Спасибо!

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 вам придется делать логическую проверку того, какой параметр совместим с каким другим вариантом самостоятельно, поскольку в опциях программы надстройки нет системы зависимостей.

Группирование опций каждой команды в другую группу опций, как описано здесь, может помочь для сгенерированного текста использования.

Другие вопросы по тегам