2010-02-08 8 views
7

Ich schrieb eine kleine App, die boost :: program_options für das Kommandozeilen-Parsing verwendet. Ich möchte einige Optionen, die einen Wert festlegen, wenn das Argument vorhanden ist, und druckt abwechselnd den aktuellen Wert, wenn der Parameter angegeben ist, aber kein Argument vorhanden ist. So „Set-Modus“ würde wie folgt aussehen:Parameter mit und ohne Argumente in boost :: program_options

dc-ctl --brightness 15 

und „-Modus erhalten“ wäre:

dc-ctl --brightness 
brightness=15 

Das Problem ist, ich weiß nicht, wie der zweiten Fall zu behandeln, dies ohne Fang Ausnahme:

error: required parameter is missing in 'brightness' 

Gibt es eine einfache Möglichkeit zu vermeiden, dass es diesen Fehler wirft? Es passiert, sobald die Argumente analysiert werden.

Antwort

4

Ich habe eine Teillösung von How to accept empty value in boost::program_options erhalten, die vorschlägt, die implicit_value-Methode für diejenigen Parameter zu verwenden, die Argumente enthalten können oder nicht. Also mein Aufruf an die „Helligkeit“ Parameter zu initialisieren, sieht wie folgt aus:

("brightness,b", po::value<string>()->implicit_value(""), 

ich dann über die variable Karte durchlaufen und für jedes Argument, das ein String ist, überprüfe ich, ob es leer ist und wenn ja, drucke ich den aktuellen Wert . Dieser Code sieht wie folgt aus:

// check if we're just printing a feature's current value 
    bool gotFeature = false; 
    for (po::variables_map::iterator iter = vm.begin(); iter != vm.end(); ++iter) 
    { 
     /// parameter has been given with no value 
     if (iter->second.value().type() == typeid(string)) 
      if (iter->second.as<string>().empty()) 
      { 
       gotFeature = true; 
       printFeatureValue(iter->first, camera); 
      } 
    } 

    // this is all we're supposed to do, time to exit 
    if (gotFeature) 
    { 
     cleanup(dc1394, camera, cameras); 
     return 0; 
    } 

UPDATE: Dies ändert die oben genannten Syntax, wenn implizite Werte verwenden, nun Argumente, wenn sie angegeben sind, müssen von der Form:

./dc-ctl -b500 

statt

./dc-ctl -b 500 

Ich hoffe, dies ist hilfreich für jemand anderen.