2012-07-01 12 views
5

Gibt es eine einfache Möglichkeit zu überprüfen, ob das Argument einer Option innerhalb einer Reihe von vordefinierten Optionen liegt? "Einfach" bedeutet hier, ohne eine Ad-hoc-Klasse zu definieren.Boost-Programmoptionen

nehme ich die Möglichkeit haben, --myoption die Wert "myvalue1" oder "myvalue2"

Zum Beispiel in Python ist wirklich einfach mit choices option in optparse

+1

Würde dies nicht nur Strings vergleichen? Angenommen sie sind beide "std :: string", könnten Sie 'if ((arg == myvalue1) || (arg == myvalue2))' 'machen. –

+0

sicher, es funktioniert, aber ich brauche etwas mehr integriert in 'Programm-Optionen' (zum Beispiel kann es die Hilfemeldung ändern), zum Beispiel mit Nicht-String arbeiten –

+0

Sie möchten mehr über das, was Sie tun möchten, zu erklären, Es ist unklar. –

Antwort

0

haben muss wie ich gerade festgestellt haben, können Sie zwei sich gegenseitig ausschließende Optionen definieren können einfach definieren eine kleine Funktion wie in real.cpp erläutert. Zum Beispiel können Sie zwei widersprüchliche Optionen angeben, die eine conflicting_options() Funktion:

void conflicting_options(const boost::program_options::variables_map & vm, 
         const std::string & opt1, const std::string & opt2) 
{ 
    if (vm.count(opt1) && !vm[opt1].defaulted() && 
     vm.count(opt2) && !vm[opt2].defaulted()) 
    { 
     throw std::logic_error(std::string("Conflicting options '") + 
           opt1 + "' and '" + opt2 + "'."); 
    } 
} 

und dann

conflicting_options (vm, "quiet", "verbose"); 

direkt nach boost::program_options::store()

Überprüfung Aufruf, dass --myoption gleich zu myvalue1 oder myvalue2 dann einfach wird eine Frage eines Funktionsaufrufs.

Ich verstehe immer noch nicht, wenn es möglich ist, zwei sich gegenseitig ausschließende Positionsoptionen zu definieren, aber das sollte eine andere Frage sein.