تعزيز خيارات البرنامج:تحليل قائمة وسيطة متعددة

StackOverflow https://stackoverflow.com/questions/2539077

سؤال

أرغب في تمرير الوسائط المتعددة ذات القيم الإيجابية أو السلبية.هل من الممكن تحليلها؟

حاليًا لدي التهيئة التالية:

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"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top