تعزيز خيارات البرنامج:تحليل قائمة وسيطة متعددة
-
23-09-2019 - |
سؤال
أرغب في تمرير الوسائط المتعددة ذات القيم الإيجابية أو السلبية.هل من الممكن تحليلها؟
حاليًا لدي التهيئة التالية:
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 كخيار آخر.
هل يمكنني تكوين خيارات البرنامج بطريقة تمكنه من قبول قيم الأعداد الصحيحة السالبة؟
شكرا أرمان.
يحرر:راجع للشغل كنت أقوم بتحليله بواسطة المحلل اللغوي البسيط
store(command_line_parser(argc, argv).options(commands).run(), vm);
, ، لكن حل كان لاستخدام الموسعة:
parse_command_line
المحلول
هل حاولت "-2"؟
يحرر: اقتباس لا يبدو أنه يقوم بالخدعة ، ومع ذلك ، فإن تغيير نمط سطر الأوامر يعمل:
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;
نصائح أخرى
ملاحظة: هذه ملاحظة للحل المقبول.
تعطيل الخيارات القصيرة هو المفتاح. الحل أعلاه المقترح من قبل كلوف يعمل بشكل رائع ، ولكن إذا كنت تستخدم 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);
ربما حاول --IDlist "0, 1, 200, -2" أو --IDlist = "0, 1, 200, -2"