Boost.ProgramOptions bietet keine direkte Unterstützung dafür. Dennoch gibt es zwei allgemeine Lösungen, die jeweils ihre Kompromisse haben:
Wenn es akzeptabel ist, --p
anstelle von -p
zu verwenden, kann eine Wildcard-Option verwendet werden. Dazu muss während der Extraktion durch variables_map
iteriert werden, da Boost.ProgramOptions keine Unterstützung bietet, wenn sowohl der Schlüssel als auch der Wert in einer überladenen validate()
-Funktion empfangen wird.
Und seine Verwendung:
%Vor% Bei diesem Ansatz muss über die gesamte Map iteriert werden, um Übereinstimmungen mit Platzhaltern zu identifizieren, was zu einer Komplexität von O(n)
führt. Außerdem muss die gewünschte Syntax geändert werden, wobei --p1 123
anstelle von -p1 123
verwendet werden muss. Diese Einschränkung ist das Ergebnis des Standard-Parser-Verhaltens von Boost.ProgramOptions, bei dem erwartet wird, dass ein einzelner Bindestrich von einem einzelnen Zeichen gefolgt wird.
Der alternative Ansatz besteht darin, einen benutzerdefinierten Parser hinzuzufügen an die command_line_parser
. Ein benutzerdefinierter Parser erlaubt die -p1
-Syntax sowie andere gängige Formulare wie --p1 123
und -p1=123
. Es gibt ein paar Verhaltensweisen, die behandelt werden müssen:
p1
und 123
erhalten. Es ist die Aufgabe des Parsers, p1
mit 123
zu verbinden. boost::program_options::unknown_option
ausgegeben. Um diese Verhaltensweisen zu berücksichtigen, verwaltet der benutzerdefinierte Parser den Status und führt die Kodierung / Dekodierung durch:
p1
empfängt, extrahiert er 1
und speichert den Status im Parser. Darüber hinaus codiert es einen Wert no operation für p
. 123
empfängt, codiert er ihn neben dem gespeicherten Status als Wert für p
. Wenn also der Parser -p1
und 123
empfängt, werden 2 Werte in den variables_map
für p
eingefügt: der Wert no operation und 1:123
.
Diese Codierung kann für den Benutzer transparent sein, indem eine Hilfsfunktion bereitgestellt wird, um den codierten p
-Vektor in eine Karte zu transformieren. Das Ergebnis der Decodierung wäre:
Hier ist der Beispielcode:
%Vor%Und seine Verwendung:
%Vor% Abgesehen davon, dass es sich um eine größere Lösung handelt, ist ein Nachteil die Anforderung, den Decodierungsprozess zu durchlaufen, um die gewünschten Werte zu erhalten. Man kann nicht einfach die Ergebnisse von vm["p"]
auf sinnvolle Weise iterieren.
Tags und Links c++ boost boost-program-options