【问题标题】:In boost::program_options, can positional arguments be skipped when already specified explictly?在 boost::program_options 中,是否可以在已明确指定时跳过位置参数?
【发布时间】:2020-10-27 20:30:22
【问题描述】:

我正在使用 boost program_options 来解析命令行参数,并且我正在尝试利用位置参数功能。目标是使输入“--tool”成为可选,并假设第一个参数是工具,如果“--tool”没有明确输入。

这显然不是 boost 参数的工作方式,正如 boost 文档中所述:https://www.boost.org/doc/libs/1_54_0/doc/html/boost/program_options/positional_opt_idp87697168.html 它说“主要假设是只有位置选项本身的相对顺序很重要,并且任何交错普通选项不会影响位置选项的解释。”

这与我想要的相反。就我而言,我有一个参数“--tool”,它也可以是第一个位置参数,但现在如果有人明确使用--tool,任何进一步的位置或未注册的参数都会被解释为第二个--tool选项,抛出存储()。我希望它最终成为下一个位置参数应该是什么。

我猜我必须自己去修改 command_line_parser 的返回值来清理它?还是我忽略了某些功能?

【问题讨论】:

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


    【解决方案1】:

    这是我迄今为止解决的问题的解决方案。如果在某些方面看起来令人担忧,请给我留言。

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

    【讨论】:

    • 一目了然(字面意思是 10 秒),看起来就像我正在做的事情
    猜你喜欢
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多