2015-08-10 11 views
6

Sto usando l'opzione di programma Boost e voglio offrire un'opzione che ha tre modi:Come avere un'opzione opzionale nel potenziamento delle opzioni del programma?

  1. Se non definire
  2. Se definito ma nessun valore
  3. Se si definisce con un valore

Ad esempio, ho un programma che funziona su un file come a.jpg e voglio offrire all'utente di poterlo utilizzare nei seguenti scenari:

myapp.exe a.jpg : process jpeg 
myapp.exe a.jpg -e : process jpeg and generate report at the same directory as a.jpg 
myapp.exe a.jpg -e c:\tmp\ : process jpeg and generate report at c:\tmp\ 

Come posso fare questo con le opzioni del programma Boost?

risposta

9

È possibile ottenere questo effetto dando il value sia uno default_value e uno implicit_value.

Il default_value verrà utilizzato quando l'opzione non è stata specificata. Il implicit_value verrà utilizzato quando l'opzione è specifica senza un valore. Se un valore è specificato, sostituirà il valore predefinito e implicito.

Così, un po 'di codice per fare questo potrebbe essere simile a questa:

#include "boost/program_options.hpp" 
#include <iostream> 
#include <string> 

using namespace std; 

int main(int argc, char** argv) 
{ 
    namespace po = boost::program_options; 

    po::options_description desc("Options"); 
    desc.add_options() 
     ("process-jpeg,e", po::value<string>()->default_value("")->implicit_value("./"), "Processes a JPEG."); 

    po::variables_map vm; 
    try 
    { 
     po::store(po::parse_command_line(argc, argv, desc), vm); 
     po::notify(vm); 
    } catch (po::error& e) { 
     cerr << "ERROR: " << e.what() << endl << endl << desc << endl; 
     return 1; 
    } 

    string outputDir = vm["process-jpeg"].as<string>(); 
    if (outputDir.empty()) { 
     cout << "-e was not provided on the command line" << endl; 
    } else { 
     cout << "-e is using directory: " << outputDir << endl; 
    } 
} 

Esecuzione di questo esempio stampe di codice:

$ ./jpg_processor 
-e was not provided on the command line 

$ ./jpg_processor -e 
-e is using directory: ./ 

$ ./jpg_processor -e c:\tmp 
-e is using directory: c:\tmp 
+0

Nizza e succinta. Ho imparato una cosa :) – sehe

+1

L'ultima [Boost-1.59] (http://www.boost.org/users/history/version_1_59_0.html) modifica questo comportamento. Se definisci 'implicit_value' e' default_value', non puoi impostare il valore e.g '--argument 3'. Se si aggiunge '--argument', viene utilizzato il valore implicito. In caso contrario, viene utilizzato il valore predefinito. Inoltre: se è definito solo "valore implicito" e l'argomento non esiste, il valore dell'argomento non è definito. –

+0

Mentre la documentazione diceva così per anni, e il codice era "semplicemente" corretto per far corrispondere la documentazione, sarei aperto agli argomenti per cambiare sia documenti che codice nelle altre direzioni. Aprire un problema su Github sarebbe l'approccio migliore se lo si desidera. –

Problemi correlati