Question

Voici une version rayée vers le bas d'un des exemples 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;
}

Quand je lance cela avec un --help je reçois cette sortie:

Usage: options_description [options]
Allowed options:
  --help                   produce help message
  --optimization arg (=10) optimization level
  --verbose [=arg(=1)]     enable verbosity (optionally specify level)

Yat-il un moyen de se débarrasser des = dans la colonne d'options ou peut-être juste laisser tomber l'affichage par défaut des args et implicites?

Était-ce utile?

La solution

Vous pouvez adapter la technique de options cachées pour fournir un ensemble d'options pour l'analyse syntaxique et un autre pour l'impression de l'aide. Cela vous demandera de conserver deux copies de la liste d'options, bien que.

Par exemple, commencer par la définition de votre desc actuelle, puis en dessous ajouter un autre:

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)")
    ;

Continuer à utiliser desc pour analyser les options de ligne de commande:

po::variables_map vm;
po::store(po::command_line_parser(argc, argv).options(desc).run(), vm);
po::notify(vm);

Mais utiliser la nouvelle description de l'option pour montrer la documentation:

if (vm.count("help"))
{
    cout << "Usage: options_description [options]\n";
    cout << display_options; // not desc
    return 0;
}

Cela devrait montrer que optimization a un argument, mais il ne révélera pas ce que sa valeur par défaut est, et il ne reconnaîtra pas que verbose accepte tout argument.

Autres conseils

Si elle est vous ne pouviez pas intégré, adapter options_description et mettre en œuvre votre propre operator<< en fonction de ce qui est dans l'en-tête de boost.

Vous pourriez être en mesure de le faire en utilisant la méthode print.

operator<< juste appels vers print de sorte que vous êtes sur votre propre AFAI peut voir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top