Beginner Tutorial

Das einfachste Beispiel

Fangen wir mit der einfachsten Variante an. Wir wollen nur zwei Optionen für unser Programm zulassen, eine um die Hilfe anzuzeigen und eine, um eine Zahl abzufragen:

#include <iostream>
#include <boost/program_options.hpp>
 
namespace bpo = boost::program_options;
 
int main( int argc, char* argv[] )
{
   try
   {
     bpo::options_description Description( "Liste der Optionen" );
     Description.add_options()
        ( "help,h", "Zeigt die Hilfe an" )
        ( "add,A", bpo::value<int>(), "Füge Zahl hinzu" );
 
     bpo::variables_map VarMap;
 
     bpo::store( bpo::parse_command_line( argc, argv, Description ), VarMap );
 
     bpo::notify( VarMap );
 
     if( VarMap.count( "help" ) ) std::cout << Description << std::endl;
 
     if( VarMap.count( "add" ) ) std::cout << "Eingegebener Wert: "
                                           << VarMap[ "add" ].as<int>()
                                           << std::endl;
   }
   catch( std::exception &e )
   {
     std::cerr << e.what() << std::endl;
   }
}
 

bpo ist ein Alias für boost::program_options, damit die Beispiele einfacher lesbar sind. Okay fangen wir an:

bpo::options_description Description( "Liste der Optionen" );
     Description.add_options()
        ( "help,h", "Zeigt die Hilfe an" )
        ( "add,A", bpo::value<int>(), "Füge Zahl hinzu" );

Als erstes Erzeugen wir ein Objekt der Klasse „options_description“. Seinem Konstruktor geben wir die Beschreibung mit, die als Überschrift in der Hilfeanzeige stehen soll. Als nächstes rufen wir die Memberfunktion „add_options“. Diese Funktion liefert ein Proxyobjekt zurück, das den ()Operator überlädt. Der Operator kann beliebig oft hintereinander gerufen werden und jeder Ruf fügt eine Option hinzu.

Der erste Ruf erzeugt eine Option, die kein Argument erwartet und entweder als „–help“ oder als „-h“ Parameter übergeben werden kann. Die Langoption und die Kurzoption sind dabei durch ein Komma getrennt. Hier sollten keine Leerzeichen verwendet werden, sonst wird die Option falsch gesetzt. Als letztes wird noch eine Beschreibung für die Hilfedatei übergeben.

Der zweite Ruf erzeugt eine Option, die ein einziges Argument vom Typ Int erwartet. Dabei wird automatisch überwacht, ob die Eingabe überhaupt zum Datentyp passt. Gibt man hier einen String, oder eine zu große Zahl ein, die einen Integer überlaufen lassen würde, dann wird eine Exception geworfen.

bpo::variables_map VarMap;

Als nächstes erzeugen wir Objekt vom Typ „variables_map“. Es funktioniert ähnlich wie std::map aus der STL. Hier werden der Optionsstring und der Wert abgelegt. Das passiert in nachfolgender Zeile:

bpo::store( bpo::parse_command_line( argc, argv, Description ), VarMap );

parse_command_line ist einer von mehrere Parsern, die von der Bibliothek angeboten werden. Andere Parser lernen wir später im Tutorial noch kennen. Diesem Parser übergeben wird die Parameter von main, sowie die Optionsbeschreibung, die wir vorher definiert haben. Mit Hilfe von store werden die geparsten Optionen in der angegebenen variables_map abgelegt.

 bpo::notify( VarMap );

Schließlich muss noch die Funktion notify wie oben gerufen werden. Durch diesen Ruf werden unter anderem die Optionswerte in die vom User angegeben Variablen abgelegt (Siehe Beschreibung von Optionen weiter unter).

Damit ist die eigentlich alles erledigt, aber wir wollen ja auch mit den übergebenen Werten arbeiten können.

FIXME