2012-04-16 25 views
5

Tôi sử dụng boost::program_options để cung cấp giao diện phân tích cú pháp dòng lệnh cho ứng dụng của tôi. Tôi muốn định cấu hình để phân tích cú pháp các tùy chọn,Cách xử lý các thông số không mong muốn trong tăng cường :: 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); 

Tôi muốn định cấu hình để mọi mã thông báo sau lần chuyển đổi cuối cùng được trả về dưới dạng vectơ. Tôi đã thử sử dụng collect_unrecognized như ví dụ được đưa ra trong tài liệu Boost nhưng tôi đã gặp phải một số vấn đề bởi vì tôi cũng đang sử dụng đối số vị trí cho tệp đầu vào.

Về cơ bản, tôi muốn làm như thế này. Nếu tôi có:

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

Tôi muốn nó để lưu trữ inputfile.abc trong giá trị input-file và trả về một vector<string> của argument1, argument2argument3 lập luận như mong muốn.

tôi sẽ tuy nhiên cũng thích để có thể có một cuộc tranh luận về vị trí, do đó

./program "inputfile.abc" argument1 argument2 argument3 

sẽ cung cấp cho tôi những kết quả tương tự.

Tôi rất tiếc nếu điều này đã được yêu cầu và cảm ơn bạn đã trợ giúp.

Trả lời

3

Tôi đã đưa ra mã thực hiện thủ thuật, nhưng đó là một giải pháp nhỏ. Tức là, tôi đã bỏ điều khoản về vị trí và sử dụng để tranh luận đầu tiên về những điều không được công nhận. Dường như nó hoạt động tốt, nhưng nó không linh hoạt lắm.

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>(); 
Các vấn đề liên quan