عند استخدام Bost :: Program_Options، كيف يقوم أحدهما بتعيين اسم الوسيطة؟
-
12-09-2019 - |
سؤال
عند استخدام 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" لاسم الوسيطة يبدو أن التحسين الصغير الذي لا يستحق القيام به. يجب أن يقول وصف جيد للخيار أيضا نوع الحجة المتوقعة.