2010-03-29 86 views
9

我想通過正值或負值的多個參數。 是否可以解析它?BOOST program_options:解析多個參數列表

目前我有以下初始化:

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

,我想呼籲:

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

所以,program_options假設我傳遞-2作爲另一種選擇。

我可以配置program_options使其可以接受負整數值嗎?

謝謝 Arman。

編輯: BTW,我用簡單的分析程序,

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

,但solution是使用擴展的一個:

parse_command_line 

回答

8

您是否嘗試過 「-2」 ?

編輯:報價似乎沒有這樣的伎倆,然而,改變了命令行風格的作品:

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被剝離 「」,所以 「-2」 成爲-2,\ -2作爲\ -2選項,單引號'-2'保持原樣。 – Arman 2010-03-29 15:37:47

+0

所以報價被剝離,它被解釋爲另一種選擇?這很奇怪,從文檔[1]看來,它似乎是要走的路。 [1] http://www.boost.org/doc/libs/1_42_0/doc/html/program_options/overview.html#id1419101 – kloffy 2010-03-29 15:45:12

+0

我想引用整個列表也行不通?(--IDlist =「0 1 200 -2」) – kloffy 2010-03-29 15:52:50

-1

也許嘗試--IDlist 「0,1,200,-2」或--IDlist =「0,1,200,-2」

+0

這不起作用 – hAcKnRoCk 2013-05-22 08:27:57

5

注意:這是對接受的解決方案的評論。

禁用短期選項是關鍵。上面提出的解決方案kloffy的效果很好,但如果您碰巧使用positional_option_description(例如,解析參數而不使用像ls file.txt instead of ls --file=file.txt這樣的選項),則可能很難將代碼轉換爲使用parse_command_line來完成此操作。

然而,你也可以禁用短選項,同時繼續使用basic_command_line_parser這樣的:

更換

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

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

謝謝,很高興知道! – Arman 2013-05-15 09:37:06

+0

好點。面對同樣的問題,我最終以字符串的形式閱讀數字,並讓用戶使用負數的引號,以避免禁用短期選項。 – TomasG 2015-09-08 18:21:28

相關問題