مشكلة في أوصاف خيارات برنامج Boost
-
30-09-2019 - |
سؤال
فيما يلي نسخة مخططة لأحد الأمثلة في Boost :: Program_options:
#include <boost/program_options.hpp>
namespace po = boost::program_options;
#include <iostream>
#include <iterator>
using namespace std;
int main( int argc, char *argv[ ] )
{
try {
int opt;
po::options_description desc("Allowed options");
desc.add_options()
( "help", "produce help message" )
( "optimization", po::value< int >(&opt)->default_value(10), "optimization level" )
( "verbose", po::value< int >()->implicit_value( 1 ), "enable verbosity (optionally specify level)" )
;
po::variables_map vm;
po::store( po::command_line_parser( argc, argv ).options( desc ).run(), vm );
po::notify( vm );
if ( vm.count( "help" ) )
{
cout << "Usage: options_description [options]\n";
cout << desc;
return 0;
}
if ( vm.count( "verbose" ) )
{
cout << "Verbosity enabled. Level is " << vm[ "verbose" ].as< int >() << "\n";
}
}
catch( std::exception& e )
{
cout << e.what() << "\n";
return 1;
}
return 0;
}
عندما أقوم بتشغيل هذا باستخدام -أنا أحصل على هذا الإخراج:
Usage: options_description [options]
Allowed options:
--help produce help message
--optimization arg (=10) optimization level
--verbose [=arg(=1)] enable verbosity (optionally specify level)
هل هناك طريقة للتخلص من عمود = في الخيارات أو ربما مجرد إسقاط عرض ARGS الافتراضي والضمني؟
المحلول
يمكنك تكييف تقنية خيارات مخفية لتوفير مجموعة واحدة من الخيارات للحلية ومجموعة أخرى لطباعة المساعدة. سيتطلب منك ذلك الحفاظ على نسختين من قائمة الخيارات.
على سبيل المثال ، ابدأ مع الحالي الخاص بك desc
التعريف ، ثم أدناه يضيف واحدة أخرى:
po::options_description display_options("Allowed options");
display_options.add_options()
("help", "produce help message")
("optimization", po::value<int>(), "optimization level")
("verbose", "enable verbosity (optionally specify level)")
;
استمر في الاستخدام desc
لتحليل خيارات سطر الأوامر:
po::variables_map vm;
po::store(po::command_line_parser(argc, argv).options(desc).run(), vm);
po::notify(vm);
لكن استخدم وصف الخيار الجديد لإظهار الوثائق:
if (vm.count("help"))
{
cout << "Usage: options_description [options]\n";
cout << display_options; // not desc
return 0;
}
يجب أن تظهر ذلك optimization
له حجة ، لكنه لن يكشف عن قيمته الافتراضية ، ولن يعترف بذلك verbose
يقبل أي حجة على الإطلاق.
نصائح أخرى
إذا لم تكن مدمجة ، فيمكنك التكيف options_description
وتنفيذ بنفسك operator<<
بناء على ما هو في رأس التعزيز.
قد تكون قادرًا على القيام بذلك باستخدام print
طريقة.
operator<<
فقط يدعو إلى print
لذلك أنت على وشك أن ترى.