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

时间:2010-07-29 14:49:41

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

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

实施例: ./myprog Ignore1 Ignore2 - 接受1 --AlsoAccept 2 --AcceptAll 1 2 -3 4

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

2 个答案:

答案 0 :(得分:3)

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

示例会话

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

答案 1 :(得分:1)

您的问题的答案几乎与我关于正确处理结束选项--的问题的答案相同:Using '--' as end-of-options marker with boost::program_options。您需要更改的唯一方法是将--AcceptAll替换为--中的extra_style_parser