سؤال

وأنا باستخدام مكتبة دفعة :: program_options لمعالجة بارامس سطر الأوامر. ولست بحاجة لقبول اسم الملف عبر -r الخيار، في حالة إذا كان فارغا (نظرا -r دون بارامس) لست بحاجة لاستخدام ستدين.

desc.add_options()
 ("replay,r", boost::program_options::value<std::string>(), "bla bla bla")
سوف

في هذه الحالة لن تقبل دفعة -r دون بارامس ورمي استثناء. الخيار DEFAULT_VALUE () لا يعمل، فضلا عن أنه من شأنها أن تجعل قيمة الإرجاع مكتبة حتى إذا كان المستخدم لا تعطي الخيار -r.

وأي أفكار كيفية تغلب؟

هل كانت مفيدة؟

المحلول

يرجى استخدام الأسلوب implicit_value، منها مثلا

desc.add_options()
 ("replay,r", po::value<std::string>()->implicit_value("stdin"), "bla bla bla")

وهذا يجعل خيار قبول إما 0 أو 1 المنوال، وإذا لم تقدم الرموز، وسوف تتصرف كما لو قدمت "ستدين. بالطبع، يمكنك اختيار أي القيمة الضمنية الأخرى - بما في ذلك سلسلة فارغة و '-'. كما اقترح صحة الأم والطفل

نصائح أخرى

هل يمكن أن تحاول خدعة مع الخيارات multitoken وzero_tokens:

using namespace std;
namespace po = boost::program_options;

vector<string> replay;

po::options_description desc("Allowed options");
desc.add_options()
    ("replay,r", po::value< vector<string> >(&replay)->multitoken()->zero_tokens(), "bla bla bla");

po::variables_map vm;        
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);    

if (vm.count("replay"))
{
  size_t s = vm["replay"].as< vector<string> >().size();
  if (s == 0)
    cout << "replay without args" << endl;
  else if (s == 1)
    cout << "replay with one arg" << endl;
  else
    cout << "replay with multiple args" << endl;
}
else
  cout << "replay not specified" << endl;

وبعد ذلك فقط الاعتماد على عدد من العناصر في ناقلات replay. فأنت تريد أن رمي خطأ إذا تم تمريرها حجج متعددة إلى <م> إعادة الخيار.

وأنا لا أعتقد أن أي المكتبات سطر الأوامر إعراب تتيح لك الحصول على الخيارات التي يمكن إما أن تتخذ حجة أم لا. إذا كان الخيار يتطلب حجة، يجب أن تعطي واحدة. في هذه الحالة، فإن الممارسة القياسية (في * نيكس على أي حال) لاستخدام "-" باعتباره اسم للدلالة على أنك تريد أن تقرأ من الإدخال القياسي.

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