2012-04-17 12 views
15

Desidero utilizzare i valori predefiniti per alcuni dei miei argomenti della riga di comando. Come faccio a comunicare a program_options quale sia l'opzione predefinita e, se l'utente non fornisce l'argomento, , come faccio a comunicare al mio programma di utilizzare il valore predefinito?Come ottengo i valori degli argomenti predefiniti con le opzioni del programma boost?

dire che voglio avere un argomento che specifica il numero di robot di inviare una furia omicida con un valore predefinito di 3.

robotkill --robots 5 produrrebbe 5 robots have begun the silicon revolution, mentre robotkill (senza argomenti in dotazione) produrrebbero 3 robots have begun the silicon revolution.

+1

La soluzione a questo problema non potrebbe essere più semplice, ma non ho potuto trovarlo documentato da nessuna parte, quindi ho fatto questa domanda. – flies

+0

Correlati: come stabilire se un'opzione con un valore predefinito è stata fornita dall'utente http://stackoverflow.com/questions/9200598/boost-program-options-with-default-values-always-present-when-using -vm-count ('count' non funziona, apparentemente perché anche quando l'opzione non viene fornita la variabile map assegnerà il valore predefinito, quindi count non è mai zero) – flies

+1

http://www.boost.org/doc/ libs/1_65_1/doc/html/boost/program_options/typed_value.html # idp698602832-bb per la descrizione tecnica e http://www.boost.org/doc/libs/1_65_0/doc/html/program_options/tutorial.html# idp419580960 per la spiegazione del tutorial pertinente. Certo, ho dovuto cercare chi dopo aver usato la tua risposta per trovare il nome corretto da cercare. – patrickvacek

risposta

18

program_options assegna automaticamente i valori predefiniti alle opzioni quando l'utente non fornisce tali opzioni. Non hai nemmeno bisogno di controllare se l'utente ha fornito una determinata opzione, usa lo stesso compito in entrambi i casi.

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

namespace po = boost::program_options; 

int main (int argc, char* argv[]) { 

    po::options_description desc("Usage"); 
    desc.add_options() 
    ("robots", po::value<int>()->default_value(3), 
    "How many robots do you want to send on a murderous rampage?"); 

    po::variables_map opts; 
    po::store(po::parse_command_line(argc, argv, desc), opts); 

    try { 
    po::notify(opts); 
    } catch (std::exception& e) { 
    std::cerr << "Error: " << e.what() << "\n"; 
    return 1; 
    } 

    int nRobots = opts["robots"].as<int>(); 
    // automatically assigns default when option not supplied by user!! 

    std::cout << nRobots << " robots have begun the silicon revolution" 
     << std::endl; 
    return 0; 
} 
Problemi correlati