2012-04-16 12 views
5

Używam boost::program_options do dostarczenia interfejsu do parsowania wiersza poleceń do mojej aplikacji. Chciałabym skonfigurować go do analizowania opcje,Jak radzić sobie z niezamawianymi parametrami w boost :: program_opcje

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); 

chciałbym skonfigurować go tak, że każdy znak po ostatnim przełącznika jest zwracany w postaci wektorowej. Próbowałem przy użyciu collect_unrecognized, jak w przykładzie podanym w dokumentacji Boost, ale wystąpiły pewne problemy, ponieważ jestem również przy użyciu argumentów pozycyjnych dla pliku wejściowego.

Zasadniczo chciałbym to zrobić tak. Jeśli mam:

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

chciałbym go przechowywać inputfile.abc wartości input-file i zwracają vector<string> od argument1, argument2 i argument3 jako niechcianych argumentów.

Chciałbym jednak również, aby móc mieć pozycyjną argumentu, tak że

./program "inputfile.abc" argument1 argument2 argument3 

mi da ten sam wynik.

Przykro mi, jeśli zostało to już zadane i dziękuję za pomoc.

Odpowiedz

3

Wpadłem na kod, który rozwiązuje problem, ale jest to niewielkie obejście problemu. Oznacza to, że porzuciłem klauzulę pozycyjną i uciekłem się do przyjęcia pierwszego argumentu nierozpoznanych. Wygląda na to, że działa dobrze, ale nie jest zbyt elastyczny.

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>(); 
Powiązane problemy