2010-06-30 12 views
7

Quindi sto lavorando su uno degli esempi per la libreria Boost program_options e volevo provare a impostare un valore predefinito per uno dei valori multipli/valori vettoriali, ma non sembra lavorare. Come penso sia suggested here to work.boost program_options problema con più valori

Quello che ho modificato è sulla linea 40:

po::options_description config("Configuration"); 
    config.add_options() 
     ("optimization", po::value<int>(&opt)->default_value(10), 
       "optimization level") 
     ("include-path,I", o::value< vector<string> >()->default_value(vector<string>(),"SOMETHING")->composing(), "include path") 
     ; 

Quando compilo questo piccolo cambiamento, mi aspetto che quando nessuna opzione -I viene passata che il "qualcosa" si aggiunge alla includono- elenco degli argomenti del percorso.

Qualcuno ha idea del perché non sia così?

Ecco il codice sorgente completo:

#include <boost/program_options.hpp> 
namespace po = boost::program_options; 


#include <iostream> 
#include <fstream> 
#include <iterator> 
using namespace std; 

// A helper function to simplify the main part. 
template<class T> 
ostream& operator<<(ostream& os, const vector<T>& v) 
{ 
    copy(v.begin(), v.end(), ostream_iterator<T>(cout, " ")); 
    return os; 
} 


int main(int ac, char* av[]) 
{ 
    try { 
     int opt; 

     // Declare a group of options that will be 
     // allowed only on command line 
     po::options_description generic("Generic options"); 
     generic.add_options() 
      ("version,v", "print version string") 
      ("help", "produce help message")  
      ; 

     // Declare a group of options that will be 
     // allowed both on command line and in 
     // config file 
     po::options_description config("Configuration"); 
     config.add_options() 
      ("optimization", po::value<int>(&opt)->default_value(10), 
        "optimization level") 
      ("include-path,I", 
       po::value< vector<string> >()->default_value(vector<string>(),"SOMETHING")->composing(), 
       "include path") 
      ; 

     // Hidden options, will be allowed both on command line and 
     // in config file, but will not be shown to the user. 
     po::options_description hidden("Hidden options"); 
     hidden.add_options() 
      ("input-file", po::value< vector<string> >(), "input file") 
      ; 


     po::options_description cmdline_options; 
     cmdline_options.add(generic).add(config).add(hidden); 

     po::options_description config_file_options; 
     config_file_options.add(config).add(hidden); 

     po::options_description visible("Allowed options"); 
     visible.add(generic).add(config); 

     po::positional_options_description p; 
     p.add("input-file", -1); 

     po::variables_map vm; 
     store(po::command_line_parser(ac, av). 
       options(cmdline_options).positional(p).run(), vm); 

     ifstream ifs("multiple_sources.cfg"); 
     store(parse_config_file(ifs, config_file_options), vm); 
     notify(vm); 

     if (vm.count("help")) { 
      cout << visible << "\n"; 
      return 0; 
     } 

     if (vm.count("version")) { 
      cout << "Multiple sources example, version 1.0\n"; 
      return 0; 
     } 

     if (vm.count("include-path")) 
     { 
      cout << "Include paths are: " 
       << vm["include-path"].as< vector<string> >() << "\n"; 
     } 

     if (vm.count("input-file")) 
     { 
      cout << "Input files are: " 
       << vm["input-file"].as< vector<string> >() << "\n"; 
     } 

     cout << "Optimization level is " << opt << "\n";     
    } 
    catch(exception& e) 
    { 
     cout << e.what() << "\n"; 
     return 1; 
    }  
    return 0; 
} 

risposta

13

Per il metodo "default_value", il primo parametro è il valore reale che si desidera l'opzione di essere, il secondo valore essendo solo la rappresentazione testuale (per visualizza in --help) quando boost non può dedurlo.

Quindi, la soluzione al vostro problema è quello di scrivere:

po::value< vector<string> >()->default_value(
     vector<string>(1, "SOMETHING"), "SOMETHING")->composing(), 

In questo modo, si stanno dicendo che il valore predefinito è un vettore con un unico elemento "qualcosa", e che si desidera visualizzare " QUALCOSA "nell'aiuto, ad esempio:

Configuration: 
    --optimization arg (=10)    optimization level 
    -I [ --include-path ] arg (=SOMETHING) 
             include path 
+0

Ah perfettamente chiaro, grazie. – Petriborg

+1

Inoltre, se si inserisce la funzione di supporto "modello ostream & operator << (ostream & os, const vector & v)" nello spazio dei nomi boost, program_options lo troverà e si può usare "-> valore_predefinito (myvector) ", quindi le opzioni predefinite verranno automaticamente convertite nella rappresentazione testuale. –

Problemi correlati