boost program_options принимает все значения после последнего флага - PullRequest
5 голосов
/ 29 июля 2010

Есть ли способ собрать все значения после указанного аргумента с помощью boost :: program_options? Есть два предостережения, о которых мне нужно позаботиться, мне нужно принять нераспознанные аргументы и принять значения, которые могут содержать тире. Я попытался поиграть с command_line_parser против parse_command_line, и я могу получить либо нераспознанные, либо значения, содержащие тире, но не оба.

Пример: ./myprog Ignore1 Ignore2 - Принять 1 - Также Принять 2 - Принять все 1 2 -3 4

Я не очень заинтересован в проверке того, что --AcceptAll - последний переданный флаг; Я просто ищу логику, которая возвращает вектор строк для всего после этого флага.

Ответы [ 2 ]

3 голосов
/ 30 июля 2010

вы пробовали позиционные опции ?

#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 голос
/ 01 апреля 2011

Ответ на ваш вопрос практически совпадает с ответом на мой вопрос о правильной обработке опции конца опций --: Использование «-» в качестве маркера конца опций с надстройкой: : program_options . Единственное, что вам нужно изменить, это заменить --AcceptAll на -- в extra_style_parser.

...