boost :: program_options附加具有相似名称的向量选项

时间:2015-06-29 13:55:55

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

我正在使用program_options来解析commandLine和配置选项,我发现了什么似乎是一个bug。使用具有相似名称的矢量选项时出现问题。如果我有一个未指定的参数“myParam”和另一个指定的参数“myParam2”,那么该库会将myParam的值附加到myParam2。

例如,当我像这样调用我的程序时:

./model -myParam2={7,8,9}  -myParam={5,6}

我明白了:

myParam not declared   <-- This is OK
myParam2 size: 5       <-- I would expect this to be size:3

我将代码缩减为以下显示问题的示例:

// Declare a group of options that will be allowed both on command line and in config file
po::options_description options("Simulator Configuration (and Command Line) options");
options.add_options()
            //("myParam", po::value<std::vector<int>>(), "test")  --> If I uncomment this line, it works as expected
            ("myParam2", po::value<std::vector<int>>(), "test");

// parse the cmdline options
auto parsed_cmdLine_options = po::command_line_parser(ac,av).options(options)
                            .style(po::command_line_style::unix_style | po::command_line_style::allow_long_disguise) // to enable options to start with a '-' instead of '--'
                            .allow_unregistered()    // to allow generic parameters (which can be read by models)
                            .run();
po::store(parsed_cmdLine_options, simulatorParams);
notify(simulatorParams);

// print parsed options
std::vector<int> tmp1, tmp2;
if(simulatorParams.count("myParam")){
    tmp1 = simulatorParams["myParam"].as<std::vector<int>>();
    std::cout << "myParam size: " << tmp1.size() << "\n";

    if(tmp1.size()!= 2){
        throw "Wrong Size";
    }
}else
{
    std::cout << "myParam not declared \n";
}

if(simulatorParams.count("myParam2")){
    tmp2 = simulatorParams["myParam2"].as<std::vector<int>>();
    std::cout << "myParam2 size: " << tmp2.size() << "\n";

    if(tmp2.size()!= 3){
        throw "Wrong Size";
    }
}

如果我取消注册注册“myParam”的行,它将按预期工作:

options.add_options()
            ("myParam", po::value<std::vector<int>>(), "test")
            ("myParam2", po::value<std::vector<int>>(), "test");

打印:

myParam size: 2
myParam2 size: 3

我真的需要使用未注册的选项,因为我会在执行后再处理它们。

这似乎是一个非常简单的错误,所以也许我在某种程度上错误地使用了这个库。

之前是否有人看到此问题或有任何想法如何解决它?

非常感谢!

修改: 我正在使用boost 1.48。 我为参数尝试了几种其他语法,它的行为方式相同:

  • with double“ - ”:./ model = myParam2 = {7,8,9} --myParam = {5,6}
  • 每个声明的单个值:./ model = myParam2 = 7 --myParam2 = 8 --myParam2 = 9 --myParam = 5 --myParam = 6
  • 结合以前的。

1 个答案:

答案 0 :(得分:2)

这是一个功能。请参阅命令行样式选项:

        

如果他们明确地识别长选项,则允许长选项的缩写拼写。如果猜测生效,则没有长选项名称应该是其他长选项名称的前缀。