2012-04-16 3 views
5

Я использую boost::program_options, чтобы предоставить интерфейс синтаксического анализа командной строки для моего приложения. Я хотел бы настроить его для анализа параметров,Как обрабатывать незапрашиваемые параметры в boost :: program_options

using namespace boost::program_options; 
options_description desc("Allowed options"); 
desc.add_options() 
    ("help,h", "produce help message") 
    ("version,v", "print the version number") 
    ("include-path,I", value< vector<string> >(), "include path") 
    ("input-file,i", value<string>(), "input file"); 

positional_options_description p; 
p.add("input-file", 1); 

variables_map vm; 

parsed_options parsed = command_line_parser(ac, av). 
options(desc).positional(p).run(); 
store(parsed, vm); 
notify(vm); 

Я хотел бы настроить его так, чтобы каждый маркер после последнего переключателя возвращается в виде вектора. Я попытался использовать collect_unrecognized, как пример, приведенный в документации Boost, но я столкнулся с некоторыми проблемами, потому что я также использую позиционные аргументы для входного файла.

В основном я хотел бы сделать это вот так. Если у меня есть:

./program -i "inputfile.abc" argument1 argument2 argument3 

Я хотел бы, чтобы хранить inputfile.abc в значении input-file и возвращают vector<string> из argument1, argument2 и argument3 в качестве нежелательных аргументов.

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

./program "inputfile.abc" argument1 argument2 argument3 

даст мне тот же результат.

Прошу прощения, если это уже было задано и спасибо вам за помощь.

ответ

3

Я придумал код, который делает трюк, но это небольшое обходное решение. То есть я отбросил позиционное предложение и прибегнул к первому аргументу непризнанных. Кажется, он работает нормально, но он не очень гибкий.

using namespace boost::program_options; 

options_description desc("Allowed options"); 
desc.add_options() 
    ("help,h", "produce help message") 
    ("version,v", "print the version number") 
    ("include-path,I", value< vector<string> >(), "include path") 
    ("input-file,i", value<string>(), "input file") 
    ; 

variables_map vm; 
vector<string> additionalParameters; 

parsed_options parsed = command_line_parser(ac, av). 
    options(desc).allow_unregistered().run(); 
store(parsed, vm); 
additionalParameters = collect_unrecognized(parsed.options, 
    include_positional); 
notify(vm); 

if (!vm.count("input-file")) 
    if (additionalParameters.empty()) 
    { 
     cerr << "error: No input file specified\n"; 
     return EXIT_FAILURE; 
    } 
    else 
    { 
     inputFileName = additionalParameters[0]; 
     additionalParameters.erase(additionalParameters.begin()); 
    } 
else 
    inputFileName = vm["input-file"].as<string>();