2016-07-10 28 views
8

Gibt es eine Möglichkeit, Programmoptionen abhängig von anderen Optionen mit boost::program_options zu machen?Boost Programm Optionen abhängige Optionen

Zum Beispiel meines Programm kann die folgende Beispiel Argumente akzeptieren:

wifi --scan --interface=en0 
wifi --scan --interface=en0 --ssid=network 
wifi --do_something_else 

In diesem Beispiel ist die interface und ssid Argumente sind nur gültig, wenn sie von scan begleitet werden. Sie sind abhängig von dem scan Argument.

Gibt es eine Möglichkeit, dies automatisch mit boost::program_options zu erzwingen? Es kann natürlich manuell implementiert werden, aber es scheint, dass es einen besseren Weg geben muss.

+0

Ich vermute, es gibt keine Möglichkeit zu sagen boost :: po, das zu tun: werfen Sie einen Blick auf die öffentlichen APIs für [Wert_Semantic] (http://www.boost.org/doc/libs/1_58_0/doc/html /boost/program_options/value_semantic.html) (das 'po :: value ()' bit) und [option_description] (http://www.boost.org/doc/libs/1_58_0/doc/html/boost/program_options /option_description.html) – Rerito

Antwort

2

Sie können zwei abhängige Optionen definieren, indem Sie einfach eine kleine Funktion definieren, wie in real.cpp erläutert. Zum Beispiel können Sie zwei angeben abhängig (oder widersprüchliche) Optionen, die eine option_dependency() Funktion:

void option_dependency(const boost::program_options::variables_map & vm, 
    const std::string & for_what, const std::string & required_option) 
{ 
    if (vm.count(for_what) && !vm[for_what].defaulted()) 
    if (vm.count(required_option) == 0 || vm[required_option].defaulted()) 
     throw std::logic_error(std::string("Option '") + for_what 
      + "' requires option '" + required_option + "'."); 
} 

und dann

option_dependency (vm, "interface", "scan"); 
option_dependency (vm, "ssid", "scan"); 

direkt nach boost::program_options::store()

Achten Sie fordern, dass diese Funktion option_dependency ist ein -nur. In diesem Fall ssid erfordert Option, aber nicht umgekehrt.