2016-07-10 35 views
8

C'è un modo per rendere le opzioni del programma dipendenti da altre opzioni usando boost::program_options?Boost Programma Opzioni dipendenti

Per esempio, il mio programma può accettare i seguenti argomenti di esempio:

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

In questo esempio, i interface e ssid argomenti sono valide soltanto se sono accompagnate da scan. Sono dipendenti dall'argomento scan.

C'è un modo per far rispettare automaticamente questo con boost::program_options? Naturalmente può essere implementato manualmente, ma sembra che ci debba essere un modo migliore.

+0

Sospetto che non ci sia modo di dire a boost :: po di farlo: dare un'occhiata alle API pubbliche per [value_semantic] (http://www.boost.org/doc/libs/1_58_0/doc/html /boost/program_options/value_semantic.html) (il bit 'po :: value ()') e [option_description] (http://www.boost.org/doc/libs/1_58_0/doc/html/boost/program_options /option_description.html) – Rerito

risposta

2

È possibile definire due opzioni dipendenti semplicemente definendo una piccola funzione come spiegato in real.cpp. Ad esempio, è possibile specificare due a seconda (o in conflitto) opzioni definendo una funzione option_dependency():

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 + "'."); 
} 

e quindi chiamando

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

subito dopo boost::program_options::store()

Prestare attenzione che questa funzione option_dependency è uno solo via. In questo caso l'opzione ssid richiede l'opzione scan, ma non il contrario.