Domanda

Sto usando la libreria boost :: program_options per elaborare i parametri della riga di comando. Devo accettare un nome di file tramite l'opzione -r, nel caso in cui sia vuoto (-r dato senza parametri) devo usare stdin.

desc.add_options()
 ("replay,r", boost::program_options::value<std::string>(), "bla bla bla")

In questo caso boost non accetterebbe -r senza parametri e genererebbe un'eccezione. L'opzione default_value () non funziona così come renderebbe il valore restituito dalla libreria anche se l'utente non ha fornito l'opzione -r.

Qualche idea su come aggirare?

È stato utile?

Soluzione

Utilizza il metodo implicit_value , ad esempio

desc.add_options()
 ("replay,r", po::value<std::string>()->implicit_value("stdin"), "bla bla bla")

Questo fa sì che l'opzione accetti 0 o 1 token e, se non vengono forniti token, funzionerà come se fosse fornito 'stdin'. Ovviamente, puoi scegliere qualsiasi altro valore implicito, inclusi stringa vuota e '-' come suggerito da mch.

Altri suggerimenti

Potresti provare un trucco con le opzioni multitoken e zero_tokens :

using namespace std;
namespace po = boost::program_options;

vector<string> replay;

po::options_description desc("Allowed options");
desc.add_options()
    ("replay,r", po::value< vector<string> >(&replay)->multitoken()->zero_tokens(), "bla bla bla");

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

if (vm.count("replay"))
{
  size_t s = vm["replay"].as< vector<string> >().size();
  if (s == 0)
    cout << "replay without args" << endl;
  else if (s == 1)
    cout << "replay with one arg" << endl;
  else
    cout << "replay with multiple args" << endl;
}
else
  cout << "replay not specified" << endl;

Quindi conta solo il numero di elementi nel vettore replay . Ti consigliamo di generare un errore se vengono passati più argomenti all'opzione replay .

Non credo che nessuna libreria di analisi della riga di comando ti consenta di avere opzioni che possono accettare o meno un argomento. Se un'opzione richiede un argomento, è necessario fornire uno. In questo caso, la pratica standard (in * NIX comunque) consiste nell'utilizzare '-' come nome file per indicare che si desidera leggere dall'input standard.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top