عند استخدام Bost :: Program_Options، كيف يقوم أحدهما بتعيين اسم الوسيطة؟

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

سؤال

عند استخدام boost::program_options, ، كيف يمكنني تعيين اسم وسيطة ل boost::program_options::value<>()?

#include <iostream>
#include <boost/program_options.hpp>

int main()
{
  boost::program_options::options_description desc;

  desc.add_options()
    ("width", boost::program_options::value<int>(),
     "Give width");

  std::cout << desc << std::endl;

  return 0;
}

يعطي الرمز أعلاه:

  --width arg           Give width

ما أريده هو استبدال arg الاسم مع شيء أكثر وصفية مثل NUM:

  --width NUM           Give width
هل كانت مفيدة؟

المحلول

في الإصدارات الحديثة من Bost (اختبار فقط ل> 1.61) هذا مدعوم بالكامل. أدناه تعديل بسيط للمثال الأول في البرنامج التعليمي، حيث يتم طباعة "المستوى" بدلا من "Arg":

po::options_description desc("Allowed options");
desc.add_options()
    ("help", "produce help message")
    ("compression", po::value<int>()->value_name("LEVEL"), "set compression level")
;

مثال على العيش

نصائح أخرى

ال program_options::value_semantic لا تحتوي الطبقة على اسم الوساطة، لذلك أعتقد أن عليك تحديد فصلك الخاص. شيء من هذا القبيل:

struct my_arg_type
    : public boost::program_options::typed_value<int>
{
    my_arg_type(std::string const& name)
        : boost::program_options::typed_value<int>(&my_value)
        , my_name(name)
        , my_value(0)
    {
    }
    std::string name() const { return my_name; }
    std::string my_name;
    int my_value;
};

boost::program_options::options_description desc;

my_arg_type arg("foo");
desc.add_options()
    ("width", &arg, "give width");

هذا يجب أن يعطي شيئا مثل:

--witdh foo    give width

في الإصدار الحالي من BOOST (1.53) لا تحتاج بعد الآن إلى جعل الفصل الخاص بك كما اقترح تيم سيلفسستر. من الممكن استخدام: Boost :: Program_Options :: Typed_Value. يمكن تكوين القيمة_ الاسم.

#include <iostream>
#include <boost/program_options.hpp>
using boost::program_options::typed_value;
using boost::program_options::options_description;

int main(int argc, char **argv) {
    options_description desc("Usage");

    int someValue;
    auto someOption = new typed_value<decltype(someValue)>(&someValue);
    someOption->value_name("NUM");
    desc.add_options()
        ("some-option,s", someOption, "The option\n");

    std::cout << desc << std::endl;
    return 0;
}

سيعرض اسم الوسيطة المكون:

Usage:
-s [ --some-option ] NUM The option

يمكن للمرء أن يحل محل arg مع شيء مختلف عن طريق المتغير العالميboost::program_options::arg:

boost::program_options::arg = "NUM";

ولكن كما هو متغير عالمي، فإنه لا يساعد الكثير في حل المشكلة عندما قد يتطلب خيار متعدد الحجج مختلفة.

إجابة daminetreg يعمل، ولكن يمكن أن يكون حرفا صغيرا عند استخدامه للحصول على الكثير من إدخالات الخيار. أنا فقط اخترقت معا الزائد ل value<T>( T* v ) قالب لبناء بلدي value_sematicق مع إضافية value_name: استخدام

template<class T>
typed_value<T>*
value(T* v, const char * value_typename)
{
    typed_value<T>* r = new typed_value<T>(v);
    r->value_name( value_typename );

    return r;        
}

يمكنك إنشاء وإضافة برنامج جديد مثل هذا:

int width;
desc.add_options()
    ("width", boost::program_options::value<int>( &width, "NUM"),
     "Give width");

(ملاحظة: لا يتناول هذا كل قوالب البناء الأخرى، خاصة وليس الافتراضي value() منشئ أن المرجع يريد استخدامه)

النهج الذي قدمه CodeBender هو الوحيد الذي يمكنك استخدامه. هذا هو في الواقع مقصود - باستخدام "Num" لاسم الوسيطة يبدو أن التحسين الصغير الذي لا يستحق القيام به. يجب أن يقول وصف جيد للخيار أيضا نوع الحجة المتوقعة.

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