2009-11-26 7 views
12

Ich verwende boost :: program_options-Bibliothek, um Befehlszeilenparameter zu verarbeiten. Ich muss einen Dateinamen über die Option -r akzeptieren, falls es leer ist (-r ohne Parameter angegeben), muss ich stdin verwenden.Wie akzeptiere ich leeren Wert in boost :: program_options

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

In diesem Fall würde Boost -r ohne Parameter nicht akzeptieren und eine Ausnahme auslösen. Die Option default_value() funktioniert nicht so gut, als würde sie den Rückgabewert der Bibliothek erzeugen, selbst wenn der Benutzer die Option -r nicht angegeben hat.

Irgendwelche Ideen, wie man arbeitet?

Antwort

26

Bitte benutzen Sie die implicit_value Verfahren, z

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

Dies macht die Option akzeptiert entweder 0 oder 1 Token, 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 jeden anderen impliziten Wert auswählen - einschließlich der leeren Zeichenfolge und '-', wie von Mch vorgeschlagen.

+0

Danke! Funktioniert perfekt – cppalex

+0

@Vladimir Prus, hier ist eine andere Frage über Optionen ohne Werte hier http://StackOverflow.com/Questions/7174781/Boost-Programm-Optionen-Notifier-for-Optionen-mit-No-Wert Ich möchte in der Lage sein, Notifier für solche Optionen hinzuzufügen oder ein Patch zu schreiben, um es zu aktivieren. Bitte, kommentieren, danke. – Riga

+0

Leider funktioniert dies nicht, wenn aus irgendeinem Grund ein leerer Wert in der INI-Datei angegeben wird. –

1

Ich glaube nicht, dass jede Befehlszeilen-Parsing-Bibliotheken Optionen haben, die entweder ein Argument nehmen können oder nicht. Wenn eine Option ein Argument erfordert, müssen Sie eins angeben. In diesem Fall besteht die übliche Praxis (in * NIX sowieso) darin, '-' als Dateinamen zu verwenden, um anzuzeigen, dass Sie von der Standardeingabe lesen wollen.

+0

Boost :: program_options * erlaubt * dies über zero_tokens(). – Rhubbarb

5

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

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ählen nur die Anzahl der Elemente in dem replay Vektor. Wenn mehrere Argumente an die Wiedergabeoption übergeben werden, wird möglicherweise ein Fehler ausgegeben.

Verwandte Themen