boost program_options 接受最后一个标志之后的所有值

发布于 2024-09-12 16:52:33 字数 327 浏览 9 评论 0原文

有没有办法使用 boost::program_options 收集指定参数后的所有值?不过,我需要注意两个警告,我需要接受无法识别的参数,并且我需要接受可能包含破折号的值。我尝试使用 command_line_parser 与 parse_command_line 进行比较,我可以得到无法识别的值或包含破折号的值,但不能同时得到两者。

例子: ./myprog Ignore1 Ignore2 --Accept 1 --AlsoAccept 2 --AcceptAll 1 2 -3 4

我并不真正关心验证 --AcceptAll 是最后通过的标志;我只是在寻找为该标志之后的所有内容返回字符串向量的逻辑。

Is there a way to collect all of the values after a specified argument with boost::program_options? There are two caveats that I need to take care of though, I need to accept unrecognized arguments, and I need to accept values that could contain dashes. I've tried playing around with command_line_parser vs parse_command_line and I can get either unrecognized or values that contain dashes, but not both.

Example:
./myprog Ignore1 Ignore2 --Accept 1 --AlsoAccept 2 --AcceptAll 1 2 -3 4

I'm not really concerned with verifying that --AcceptAll is the last flag passed; I'm just looking for logic that returns a vector of strings for everything after that flag.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

星星的軌跡 2024-09-19 16:52:33

您尝试过 位置选项

#include <boost/program_options.hpp>

#include <boost/foreach.hpp>

#include <iostream>
#include <string>

namespace po = boost::program_options;

int
main( unsigned int argc, char** argv )
{
    std::string foo;
    std::vector<std::string> extra;
    po::options_description desc;
    desc.add_options()
        ("foo", po::value<std::string>(&foo), "some string")
        ("extra-options", po::value(&extra), "extra args" )
        ;

    po::positional_options_description p;
    p.add("extra-options", -1);

    po::variables_map vm;
    po::store(
            po::command_line_parser(argc, argv).
            options(desc).
            positional(p).
            run(),
            vm);
    po::notify(vm);

    BOOST_FOREACH( const std::string& i, extra ) {
        std::cout << i << std::endl;
    }

    return 0;
}

示例会话

samm@macmini ~> ./a.out --foo bar far hello world how are you
far
hello
world
how
are
you
samm@macmini ~>

have you tried positional options?

#include <boost/program_options.hpp>

#include <boost/foreach.hpp>

#include <iostream>
#include <string>

namespace po = boost::program_options;

int
main( unsigned int argc, char** argv )
{
    std::string foo;
    std::vector<std::string> extra;
    po::options_description desc;
    desc.add_options()
        ("foo", po::value<std::string>(&foo), "some string")
        ("extra-options", po::value(&extra), "extra args" )
        ;

    po::positional_options_description p;
    p.add("extra-options", -1);

    po::variables_map vm;
    po::store(
            po::command_line_parser(argc, argv).
            options(desc).
            positional(p).
            run(),
            vm);
    po::notify(vm);

    BOOST_FOREACH( const std::string& i, extra ) {
        std::cout << i << std::endl;
    }

    return 0;
}

sample session

samm@macmini ~> ./a.out --foo bar far hello world how are you
far
hello
world
how
are
you
samm@macmini ~>
萌化 2024-09-19 16:52:33

您的问题的答案实际上与我关于正确处理选项结束选项 -- 的问题的答案相同:使用“--”作为 boost::program_options 的选项结束标记。您唯一需要更改的就是将 extra_style_parser 中的 -- 替换为 --AcceptAll

The answer to your question is virtually the same as the answer to my question about handling the end-of-options option -- properly: Using '--' as end-of-options marker with boost::program_options. The only thing you need to change is to substitute --AcceptAll for -- in the extra_style_parser.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文