2010-03-29 4 views
9

Я хотел бы передать несколько аргументов с положительными или отрицательными значениями. Можно ли его разобрать?BOOST program_options: разбор нескольких списков аргументов

В настоящее время у меня есть следующие инициализации:

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") 
       ; 

, и я хотел бы назвать:

./test_ids.x --IDlist=0 1 200 -2 
unknown option -2 

Таким образом, program_options предполагает, что я передаю -2 как другой вариант.

Могу ли я настроить program_options таким образом, чтобы он мог принимать отрицательные целые значения?

Thanks Arman.

EDIT: КСТАТИ Я разборе его с помощью простого парсера

store(command_line_parser(argc, argv).options(commands).run(), vm); 

, но solution должен был использовать расширенный один:

parse_command_line 

ответ

8

Вы пробовали "-2" ?

Edit: Цитирование, кажется, не делать трюк, однако, изменив стиль командной строки работает:

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; 
+0

program_options являются зачистки "", так что "-2" стал -2, также \ -2 принимает в качестве опции \ -2, одиночные кавычки «-2» остаются такими, какие есть. – Arman

+0

Итак, кавычки лишены и интерпретируются как еще один вариант? Это странно, из документации [1] казалось, что это будет путь. [1] http://www.boost.org/doc/libs/1_42_0/doc/html/program_options/overview.html#id1419101 – kloffy

+0

Я полагаю, что цитирование всего списка тоже не работает?(--IDlist = "0 1 200 -2") – kloffy

-1

возможно попробовать --IDlist "0, 1, 200, -2" или --IDlist = "0, 1, 200, -2"

+0

это не работает – hAcKnRoCk

5

ПРИМЕЧАНИЕ: это замечание к принятому решению.

Отключение коротких опций - это ключ. Решение выше, предложенное kloffy, отлично работает, но если вы используете positional_option_description (например, для анализа параметров без использования опции, например ls file.txt instead of ls --file=file.txt), вам может потребоваться преобразование вашего кода с помощью parse_command_line.

Однако вы также можете отключить короткие варианты и продолжать использовать basic_command_line_parser так:

Заменить

store(command_line_parser(argc, argv).options(commands).run(), vm); 

с

store(command_line_parser(argc, argv).options(commands).style(
po::command_line_style::unix_style^po::command_line_style::allow_short 
).run(), vm); 
+0

спасибо, приятно знать! – Arman

+0

Хорошая точка. Перед той же проблемой я закончил чтение чисел в виде строк и попросил пользователя использовать кавычки для отрицательных чисел, чтобы избежать отключения коротких опций. – TomasG

Смежные вопросы