2016-07-10 13 views
8

Czy istnieje sposób uzależnienia opcji programu od innych opcji za pomocą boost::program_options?Opcje zależne opcji programu doładowania

Na przykład, mój program może przyjąć następujące przykładowe argumenty:

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

W tym przykładzie interface i ssid argumenty są ważne tylko wtedy, gdy towarzyszy im scan. Są one zależne od argumentu scan.

Czy istnieje jakiś sposób, aby wymusić ten automatycznie boost::program_options? Można go oczywiście zaimplementować ręcznie, ale wydaje się, że musi być lepszy sposób.

+0

podejrzewam, nie ma sposobu mówienia boost :: Po to zrobić: przyjrzeć API publicznych [value_semantic] (http://www.boost.org/doc/libs/1_58_0/doc/html /boost/program_options/value_semantic.html) (bit 'po :: value ()') i [opcja opis] (http://www.boost.org/doc/libs/1_58_0/doc/html/boost/program_options /option_description.html) – Rerito

Odpowiedz

2

Można zdefiniować dwie opcje zależne prostu określające małą funkcję jak wyjaśniono w real.cpp. Na przykład, można określić dwa zależności (lub sprzecznych) opcje definiowania option_dependency() funkcję:

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

a następnie wywołanie

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

zaraz po boost::program_options::store()

Należy zwrócić uwagę, że ta funkcja option_dependency jest jednym tylko -way. W takim przypadku ssid wymaga opcji scan, ale nie na odwrót.

Powiązane problemy