Я заинтересован в том, чтобы иметь один исполняемый файл, который принимает команды уровня 2 в командной строке - вроде как git commit
и git add
- это свои собственные отдельные команды в пределах одного EXE. Поэтому мой вопрос: есть ли способ упростить это с помощью ProgramOptions? Я знаю, что могу определить разные схемы, а затем проверить argv[1]
на определенную строку, но я надеюсь, что есть более чистый способ. Благодаря!Лучший способ обработки команд уровня 2 с Boost ProgramOptions
1
A
ответ
1
Вы можете использовать positional parameters:
#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 вы должны будете делать логические проверки того, какой вариантом является совместимым с которой другим вариантом себя, так как не существует системы зависимостей в настройках подталкивания программы.
Группировка каждой опции команды в другой группе параметров, как описано here, может помочь в генерированном тексте использования.