Problème avec les options du programme boost descriptions
-
30-09-2019 - |
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?
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.