C++ 在boost::program_选项中,如果已经明确指定了位置参数,是否可以跳过?

C++ 在boost::program_选项中,如果已经明确指定了位置参数,是否可以跳过?,c++,boost,boost-program-options,C++,Boost,Boost Program Options,我正在使用boost program_选项来解析命令行参数,并试图利用位置参数特性。目标是使键入“-tool”成为可选的,并假设如果“-tool”不是显式键入的,则第一个参数就是工具 这显然不是boost参数的工作方式,正如boost文档中所述:“主要假设是只有位置选项本身的相对顺序才重要,任何交错的普通选项都不会影响位置选项的解释。” 这与我想要的正好相反。在我的例子中,我有一个参数--tool,它也可以是第一个位置参数,但现在如果有人显式使用--tool,任何进一步的位置参数或未注册的参数都

我正在使用boost program_选项来解析命令行参数,并试图利用位置参数特性。目标是使键入“-tool”成为可选的,并假设如果“-tool”不是显式键入的,则第一个参数就是工具

这显然不是boost参数的工作方式,正如boost文档中所述:“主要假设是只有位置选项本身的相对顺序才重要,任何交错的普通选项都不会影响位置选项的解释。”

这与我想要的正好相反。在我的例子中,我有一个参数--tool,它也可以是第一个位置参数,但现在如果有人显式使用--tool,任何进一步的位置参数或未注册的参数都会被解释为第二个--tool选项,该选项将抛出store()。我希望它最终成为下一个位置参数


我猜我必须亲自修改命令行解析器的返回值来清理它?还是有什么我忽略了的功能?

这是到目前为止我自己的问题的解决方案。请给我一个意见,如果它似乎在某些方面有关

auto parsedOptions = boost::program_options::command_line_parser(argc, argv).options(optDesc).positional(posOptDesc).allow_unregistered().run();
//Boost doesn't ignore positional arguments if they are explicitly given, so we have to do it ourselves here:     
int positionalIncrement = 0;
for (auto opt = parsedOptions.options.begin(); opt != parsedOptions.options.end(); ++opt)
{
    if (opt->position_key >= 0)
    {
        int priorMatchingKeys = static_cast<int>(std::count_if(parsedOptions.options.begin(), opt, [&](boost::program_options::option& val)->bool {return ( val.string_key == posOptDesc.name_for_position(opt->position_key + positionalIncrement) ) && val.position_key < 0; }));
        opt->string_key = posOptDesc.name_for_position(opt->position_key + positionalIncrement + priorMatchingKeys);

        positionalIncrement+=priorMatchingKeys;
    }
}
boost::program_options::store(parsedOptions, *_vm);
autoparsedoptions=boost::program_options::command_line_parser(argc,argv).options(optDesc).positional(posOptDesc).allow_unregisted().run();
//Boost不会忽略位置参数(如果它们是显式给定的),因此我们必须在这里自己做:
整数增量=0;
for(auto opt=parsedOptions.options.begin();opt!=parsedOptions.options.end();+opt)
{
如果(选项->位置键>=0)
{
int priorMatchingKeys=static_cast(std::count_if(parsedOptions.options.begin(),opt,[&](boost::program_options::option::option&val)->bool{return(val.string_key==posOptDesc.name_for_position(opt->position_key+positionincrement))&&val.position_键<0;});
opt->string\u key=posOptDesc.name\u表示位置(opt->position\u key+positionincrement+priorMatchingKeys);
位置增量+=优先权;
}
}
boost::program\u options::store(解析选项,*\u虚拟机);
一目了然(字面上是10秒),这看起来就像我正在做的事情