Frage

Ich bin mit boost :: program_options Bibliothek Befehlszeile params zu verarbeiten. Ich brauche einen Dateinamen über -r Option, falls anzunehmen, wenn es leer ist (-r ohne params gegeben) Ich brauche stdin zu verwenden.

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

In diesem Fall Auftrieb würde ohne params nicht akzeptieren -r und eine Ausnahme werfen. default_value () Option funktioniert nicht so gut, wie es auch Bibliothek Rückgabewert machen würde, wenn der Benutzer nicht -r Option gegeben hat.

Alle Ideen, wie zu umgehen?

War es hilfreich?

Lösung

Bitte benutzen Sie die implicit_value Verfahren, z

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

Das macht die Option entweder 0 oder 1 Token akzeptieren, und wenn keine Token zur Verfügung gestellt werden, wird es tun, als ob ‚stdin‘ zur Verfügung gestellt wurde. Natürlich können Sie einen beliebigen anderen impliziten Wert auswählen - einschließlich leere Zeichenkette und ‚-‘. Wie mch vorgeschlagen

Andere Tipps

Sie könnten einen Trick mit den multitoken und zero_tokens Optionen versuchen:

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;

Dann zählt nur die Anzahl der Elemente in dem replay Vektor. Sie wollen einen Fehler werfen, wenn mehrere Argumente übergeben werden, die Wiederholung Option.

Das glaube ich keine Befehlszeile Parsen Bibliotheken ermöglicht es Ihnen, Optionen zu haben, die entweder ein Argument kann oder nicht. Wenn eine Option ein Argument erfordert, müssen Sie eine geben. In diesem Fall ist die gängige Praxis (in * NIX sowieso) verwenden ‚-‘ als Dateinamen zu bezeichnen, dass Sie von der Standardeingabe lesen möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top