2010-02-08 3 views
7

Ho scritto una piccola app che utilizza boost :: program_options per l'analisi della riga di comando. Mi piacerebbe avere alcune opzioni che impostano un valore se l'argomento è presente, e stampa alternativamente il valore corrente se il parametro è dato ma non è presente alcun argomento. Così "set-mode" sarà simile:Parametri con e senza argomenti in boost :: program_options

dc-ctl --brightness 15 

e "modalità di ottenere" sarebbe:

dc-ctl --brightness 
brightness=15 

Il problema è, non so come gestire secondo caso senza prendere questo eccezione:

error: required parameter is missing in 'brightness' 

C'è un modo semplice per evitare di lanciare quell'errore? Accade non appena gli argomenti vengono analizzati.

risposta

4

Ho ottenuto una soluzione parziale da How to accept empty value in boost::program_options che suggerisce l'utilizzo del metodo implicit_value su quei parametri che possono presentare o meno argomenti. Quindi la mia chiamata per inizializzare il parametro di "luminosità", si presenta così:

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

Ho poi iterare la mappa variabile e per qualsiasi argomento che è una stringa, verifico se è vuoto e se quindi stampare il valore corrente . Tale codice è simile al seguente:

// 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: questo cambia la sintassi di cui sopra, quando si utilizzano valori impliciti, ora argomenti, quando somministrato, deve essere di forma:

./dc-ctl -b500 

anziché

./dc-ctl -b 500 

Spero che questo sia utile a qualcun altro.