2015-03-16 3 views
1

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

ответ

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, может помочь в генерированном тексте использования.

 Смежные вопросы

  • Нет связанных вопросов^_^