Opções do programa BOOST:analisando lista de múltiplos argumentos
-
23-09-2019 - |
Pergunta
Gostaria de passar os vários argumentos com valores positivos ou negativos.É possível analisá-lo?
Atualmente tenho a seguinte inicialização:
vector<int> IDlist;
namespace po = boost::program_options;
po::options_description commands("Allowed options");
commands.add_options()
("IDlist",po::value< vector<int> >(&IDlist)->multitoken(), "Which IDs to trace: ex. --IDlist=0 1 200 -2")
("help","print help")
;
e eu gostaria de ligar:
./test_ids.x --IDlist=0 1 200 -2
unknown option -2
Então, o program_options assume que estou passando -2 como outra opção.
Posso configurar o program_options de forma que ele possa aceitar valores inteiros negativos?
Obrigado Arman.
EDITAR:Aliás, eu estava analisando pelo analisador simples
store(command_line_parser(argc, argv).options(commands).run(), vm);
, mas solução era usar o estendido:
parse_command_line
Solução
Você já tentou "-2"?
Editar: Citar não parece fazer o truque, no entanto, mudar o estilo de linha de comando funciona:
char* v[] = {"name","--IDlist=0","1","200","-2"};
int c = 5;
std::vector<int> IDlist;
namespace po = boost::program_options;
po::options_description commands("Allowed options");
commands.add_options()
("IDlist",po::value< std::vector<int> >(&IDlist)->multitoken(), "Which IDs to trace: ex. --IDlist=0 1 200 -2")
("help","print help")
;
po::variables_map vm;
po::store(parse_command_line(c, v, commands, po::command_line_style::unix_style ^ po::command_line_style::allow_short), vm);
po::notify(vm);
BOOST_FOREACH(int id, IDlist)
std::cout << id << std::endl;
Outras dicas
NOTA: Esta é uma observação para a solução aceita.
Desativar opções curtas é a chave. A solução acima proposta por Kloffy funciona muito bem, mas se você usar positional_option_description
(por exemplo, para analisar os parâmetros sem usar uma opção como ls file.txt instead of ls --file=file.txt
) você pode ter dificuldade em converter seu código para fazer isso usando parse_command_line
.
No entanto, você também pode desativar opções curtas e continuar usando o basic_command_line_parser
assim:
Substituir
store(command_line_parser(argc, argv).options(commands).run(), vm);
com
store(command_line_parser(argc, argv).options(commands).style(
po::command_line_style::unix_style ^ po::command_line_style::allow_short
).run(), vm);
talvez tente --IDlist "0, 1, 200, -2" ou --IDlist="0, 1, 200, -2"