سؤال

فيما يلي نسخة مخططة لأحد الأمثلة في 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 لذلك أنت على وشك أن ترى.

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