2010-03-29 3 views
9

Tôi muốn chuyển nhiều đối số với giá trị dương hoặc âm. Có thể phân tích cú pháp không?BOOST program_options: phân tích cú pháp nhiều danh sách đối số

Hiện nay tôi có một khởi sau:

vector<int> IDlist; 
namespace po = boost::program_options;  
po::options_description commands("Allowed options"); 
      commands.add_options()    
       ("IDlist",po::value< vector<int> >(&IDlist)->multitoken(), "Which IDs to trace: ex. --IDlist=0 1 200 -2") 
       ("help","print help") 
       ; 

và tôi muốn gọi:

./test_ids.x --IDlist=0 1 200 -2 
unknown option -2 

Vì vậy, program_options giả định rằng tôi đi qua -2 như một tùy chọn khác.

Tôi có thể định cấu hình program_options theo cách có thể chấp nhận giá trị số nguyên âm không?

Cảm ơn Arman.

EDIT: BTW tôi đã phân tích nó bằng cách phân tích cú pháp đơn giản

store(command_line_parser(argc, argv).options(commands).run(), vm); 

, nhưng solution là sử dụng các mở rộng một:

parse_command_line 

Trả lời

8

Các bạn đã thử "-2" ?

Edit: Trích dẫn không dường như làm các trick, tuy nhiên, việc thay đổi phong cách dòng lệnh hoạt động:

char* v[] = {"name","--IDlist=0","1","200","-2"}; 
int c = 5; 

std::vector<int> IDlist; 

namespace po = boost::program_options;  
po::options_description commands("Allowed options"); 
commands.add_options()    
    ("IDlist",po::value< std::vector<int> >(&IDlist)->multitoken(), "Which IDs to trace: ex. --IDlist=0 1 200 -2") 
    ("help","print help") 
; 

po::variables_map vm; 
po::store(parse_command_line(c, v, commands, po::command_line_style::unix_style^po::command_line_style::allow_short), vm); 
po::notify(vm); 

BOOST_FOREACH(int id, IDlist) 
    std::cout << id << std::endl; 
+0

program_options đang tước "", vì vậy "-2" trở thành -2, cũng là \ -2 mất tùy chọn \ -2, dấu ngoặc đơn '-2' vẫn như cũ. – Arman

+0

Vì vậy, các dấu ngoặc kép bị tước bỏ và nó được hiểu là một lựa chọn khác? Đó là lẻ, từ tài liệu [1] nó có vẻ như nó sẽ là con đường để đi. [1] http://www.boost.org/doc/libs/1_42_0/doc/html/program_options/overview.html#id1419101 – kloffy

+0

Tôi cho rằng việc trích dẫn toàn bộ danh sách cũng không hoạt động?(--IDlist = "0 1 200 -2") – kloffy

-1

có thể thử --IDlist "0, 1, 200, -2" hoặc --IDlist = "0, 1, 200, -2"

+0

điều này không hoạt động – hAcKnRoCk

5

LƯU Ý: đây là một nhận xét cho giải pháp được chấp nhận.

Tắt tùy chọn ngắn là chìa khóa. Giải pháp ở trên được đề xuất bởi kloffy hoạt động tuyệt vời, nhưng nếu bạn sử dụng positional_option_description (ví dụ: để phân tích cú pháp thông số mà không sử dụng tùy chọn như ls file.txt instead of ls --file=file.txt), bạn có thể gặp khó khăn khi chuyển đổi mã của mình để thực hiện điều đó bằng cách sử dụng parse_command_line.

Tuy nhiên bạn cũng có thể vô hiệu hóa tùy chọn ngắn và tiếp tục sử dụng các basic_command_line_parser như thế này:

Thay

store(command_line_parser(argc, argv).options(commands).run(), vm); 

với

store(command_line_parser(argc, argv).options(commands).style(
po::command_line_style::unix_style^po::command_line_style::allow_short 
).run(), vm); 
+0

cảm ơn, tốt để biết! – Arman

+0

Điểm tốt. Đối mặt với cùng một vấn đề, tôi đã đọc các con số dưới dạng chuỗi và khi người dùng sử dụng dấu ngoặc kép cho các số âm, để tránh vô hiệu các tùy chọn ngắn. – TomasG