Boost.Program_options — бесплатное значение (значение без опции)

Мне нужно использовать следующий синтаксис для программы:

myprogram config.ini --option1 value --option2 value2

Я использую что-то вроде следующего:

  namespace po = boost::program_options;

  po::options_description desc("Allowed options");
  desc.add_options()
        ("option1", po::value<std::string>()->required(), "option 1")
        ("option2", po::value<uint16_t>()->required(), "option 2")
        ("help", "this message");

  po::variables_map opts;
  po::store(po::command_line_parser(argc, argv).options(desc).run(), opts);

  if (opts.count("help")) {
        show_help(desc);
        return 0;
  }

  po::notify(opts);

Можно ли использовать Boost.Program_options для перехвата первого параметра (config.ini)? Или любое значение без спецификатора опции?


person vladon    schedule 11.12.2015    source источник


Ответы (1)


Согласно документации, они могут обрабатываться с помощью позиционных аргументов.

Вы можете найти еще один хороший пример здесь в разделе Указание Позиционные параметры.

Если я понимаю вашу предполагаемую функциональность, вот как вы могли бы объединить ее для работы в приведенном выше примере.

namespace po = boost::program_options;

po::options_description desc( "Allowed options" );

desc.add_options( )
    ( "option1", po::value<std::string>( )->required( ), "option 1" )
    ( "option2", po::value<uint16_t>( )->required( ), "option 2" )
    // this flag needs to be added to catch the positional options
    ( "config-file", po::value<std::string>( ), ".ini file" )
    ( "help", "this message" );

po::positional_options_description positionalDescription;

// given the syntax, "config.ini" will be set in the flag "config-file"
positionalDescription.add( "config-file", -1 );

po::variables_map opts;

po::store( 
    po::command_line_parser( argc, argv )
        .options( desc )
        // we chain the method positional with our description
        .positional( positionalDescription )
        .run( ), 
    opts 
);

if (opts.count( "help" )) 
{
    show_help( desc );

    return 0;
}

po::notify( opts );
person Austin Brunkhorst    schedule 11.12.2015
comment
Отлично, спасибо, работает! Просто примечание: нужно также добавить "config-file" к desc, прежде чем добавлять к позиционному описанию. - person vladon; 11.12.2015