【问题标题】:BOOST program_options: parsing multiple argument listBOOST program_options:解析多个参数列表
【发布时间】:2011-02-02 02:28:21
【问题描述】:

我想传递具有正值或负值的多个参数。 可以解析吗?

目前我有以下初始化:

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 配置为可以接受负整数值吗?

谢谢 阿尔曼。

编辑: 顺便说一句,我是用简单的解析器解析它

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

,但solution 是使用扩展的:

parse_command_line

【问题讨论】:

    标签: c++ boost boost-program-options


    【解决方案1】:

    你试过“-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;
    

    【讨论】:

    • program_options 正在剥离 "" ,因此 "-2" 变为 -2,\-2 也作为 \-2 选项,单引号 '-2' 保持原样。
    • 所以引号被剥离并被解释为另一种选择?这很奇怪,从文档 [1] 来看,这似乎是要走的路。 [1]boost.org/doc/libs/1_42_0/doc/html/program_options/…
    • 我想引用整个列表也不起作用? (--IDlist="0 1 200 -2")
    • 是的,如果我通过 --IDlist="-0 100" 输出是: in option 'IDlist': invalid option value '-0 100' 在我看来,我应该将 IDlist 作为向量字符串,然后将它们转换为整数。
    • 剥去引号的是外壳。
    【解决方案2】:

    也许试试 --IDlist "0, 1, 200, -2" 或 --IDlist="0, 1, 200, -2"

    【讨论】:

      【解决方案3】:

      注意:这是对已接受解决方案的备注。

      禁用短选项是关键。 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);
      

      【讨论】:

      • 好点。面对同样的问题,我最终将数字读取为字符串,并要求用户对负数使用引号,以避免禁用短选项。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      相关资源
      最近更新 更多