2012-04-16 89 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.abcinput-file價值和回報的argument1argument2argument3爲未經請求的參數的vector<string>

我會然而,也希望能夠有一個位置參數,使

./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>(); 
相關問題