2012-04-16 20 views
5

İstenmeyen parametreler nasıl kullanılır? Uygulamam için komut satırı ayrıştırma arabirimi sağlamak için boost::program_options kullanıyorum. Ben seçenekleri ayrıştırmak için yapılandırmak istiyorumBoole :: 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); 

Geçen anahtarından sonra her belirteç vektörü bir biçimde döndürülür için yapılandırmanız istiyorum. Boost belgelerinde verilen örneğe göre collect_unrecognized kullanmayı denedim, ancak giriş dosyası için konumsal argümanlar kullanıyorum çünkü bazı sorunlara rastladım.

Temel olarak bunu böyle yapmak isterim. Ben varsa:

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

Ben input-file değerindeki inputfile.abc depolamak ve bir vector<string>argument1, argument2 ve argument3 olarak istenmeyen tartışmaların dönmek istiyorum.

Ben ancak aynı zamanda

./program "inputfile.abc" argument1 argument2 argument3 

bana aynı sonucu verecek şekilde, bir konumsal argüman var edebilmek istiyorum.

Bu zaten sorulmuşsa ve yardım için size teşekkür ederim.

cevap

3

Hile yapan bir kod kullanarak geldim, ancak bu biraz geçici bir çözümdür. Yani, ben konumsal maddeyi bıraktım ve tanınmayanların ilk argümanını almaya başvurdum. İyi çalışıyor gibi görünüyor, ama çok esnek değil.

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