2010-03-29 104 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

相关问题