como faço para obter os não-bandeira e não-opção fichas após o boost :: program_options analisa meus argumentos de linha de comando
-
19-09-2019 - |
Pergunta
Em python, eu posso construir a minha optparse exemplo de tal forma que ele será automaticamente filtro as opções e não-opção / bandeiras em dois baldes diferentes:
(options, args) = parser.parse_args()
Com boost :: program_options, como faço para recuperar uma lista de fichas que são os remanescentes não-opção e não-bandeira fichas?
por exemplo. Se o meu programa tem bandeiras
--foo
--bar BAR
e eu, em seguida, passar na linha de comando:
--foo hey --bar BAR you
Como posso obter uma lista composta unicamente de tokens "hey" e "você"
Solução
IIRC, você tem que usar uma combinação de positional_options_description
e opções escondidas . A ideia é (1) adicionar uma opção normal e dar-lhe um nome, talvez algo como --positional=ARG
, (2) não incluem essa opção na descrição de ajuda, (3) configure command_line_parser
para tratar todos os argumentos posicionais como se --positional
foi especificada, e (4) recuperar os argumentos posicionais usando vm["positional"].as< std::vector<std::string> >()
.
Há provavelmente um exemplo em algum lugar na árvore de origem, mas eu não tê-lo nesta máquina agora.
Outras dicas
Aqui está um exemplo:
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
Em seguida, é só pegar "input" opções nomeadas como vetor de strings e está tudo pronto.