15

Mein Programm (prog.exe) unterstützt die folgenden vier Flags: -P, -p, -b und -s. Allerdings:Sätze von sich gegenseitig ausschließenden Optionen in den Boost-Programmoptionen

  • -b und -p müssen zusammen angegeben werden, bilden einen Satz, und haben beispielsweise numerische Werte -b 42
  • -s kann nicht mit dem oben Satz angegeben werden, und vice versa
  • -P ist in beiden Fällen zwingend

Als solche prog.exe nur entweder als

prog.exe -P -s 

oder

ausgeführt werden kann,
prog.exe -P -b -42 -p 8 

Gibt es eine Möglichkeit, die oben genannten Sätze von sich gegenseitig ausschließenden Befehlszeilenoptionen in Boost-Programmoptionen anzugeben?

+1

Das ist Teil der Logik in der (obligate) 'parseOptions()' Methode einer 'boost :: program_options' Client-Anwendung implementieren IMHO. –

+2

Ich habe solche Situationen kennengelernt und ordne sie normalerweise einigen Enum-Optionen für den "Programmausführungsmodus" zu. Ich suche zuerst die Einstellungen für diese Option und nach der Bestimmung, fahren Sie mit den spezifischen Optionen fort ... –

Antwort

17

Sie sollten mit ein paar Tutorials beginnen [1][2] zu verstehen, wie boost::program_options funktioniert.

Dann können Sie zwei sich gegenseitig ausschließende Optionen definieren, indem Sie einfach eine kleine Funktion definieren, wie in real.cpp erläutert. Zum Beispiel können Sie zwei gegensätzliche (oder je) Optionen, die eine conflicting_options() Funktion angeben:

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()

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

+3

Meiner Meinung nach ist es so viel Boilerplate-Code! Warum sollte nicht die Unterstützung gegenseitig ausschließender Gruppen wie Pythons Argarse erhöht werden? – Asalle

+0

Python ist fast immer prägnanter als C++, war es schon immer. C++ 11/14/17 bewegen sich in diese Richtung, aber das Tempo ist langsam. – Avio

Verwandte Themen