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