2009-08-22 3 views
4

В python я могу построить свой экземпляр optparse, чтобы он автоматически отфильтровывал параметры и не-опции/флаги в двух различных ковшей:Как получить токены без флага и без опциона после boost :: program_options анализирует мою командную строку args

(options, args) = parser.parse_args() 

С повышением :: program_options, как я могу получить список лексем, которые оставшиеся без опций и без флагов лексемы?

например. Если моя программа имеет флаги

--foo 
--bar BAR 

, а затем я перехожу в командной строке:

--foo hey --bar BAR you 

, как я могу получить список, состоящий исключительно из лексем «эй» и «вы»

+0

retagged для согласованности с другими библиотеками boost, которые и опции boost-program уже существуют. – rcollyer

+1

Ewwwww, библиотеки boost настолько уступают Python's: '(У меня тоже были проблемы с этим. –

ответ

2

IIRC , вы должны использовать комбинацию positional_options_description и hidden options. Идея состоит в том, чтобы (1) добавить обычный вариант и дать ему имя, может быть, что-то вроде --positional=ARG, (2) не включать эту опцию в описание справки, (3) настроить command_line_parser для обработки всех позиционных аргументов, как если бы --positional был и (4) получить аргументы позиции с помощью vm["positional"].as< std::vector<std::string> >().

Возможно, есть пример где-то в исходном дереве, но сейчас у меня его нет на этой машине.

4

Вот пример:

namespace po = boost::program_options;  
po::positional_options_description m_positional; 
po::options_description m_cmdLine; 
po::variables_map m_variables; 

m_cmdLine.add_options() 
    (/*stuff*/) 
    ("input", po::value<vector<string> >()->composing(), "") 
; 
m_positional.add("input", -1); 
po::parsed_options parsed = po::command_line_parser(argc, argv) 
         .options(m_cmdLine) 
         .positional(m_positional) 
         .allow_unregistered() 
         .run(); 
// store, notify, etc 

Тогда просто получить «на входе», названные варианты как вектор строк, и вы все сделали.