15

Il mio programma (prog.exe) supporta i seguenti quattro bandiere: -P, -p, -b e -s. Tuttavia:gruppi di opzioni mutualmente esclusive spinta opzioni del programma

  • -b e -p devono essere specificati insieme, costituiscono un insieme, e hanno valori numerici esempio -b 42
  • -s non può essere specificato con il precedente insieme, e viceversa
  • -P è obbligatoria in entrambi i casi

Come tale prog.exe può essere eseguito solo o come

prog.exe -P -s 

o

prog.exe -P -b -42 -p 8 

Esiste un modo per specificare i set di opzioni reciprocamente esclusive della riga di comando nelle opzioni del programma boost?

+1

Questo fa parte della logica da implementare nel metodo (obbligatorio) 'parseOptions()' di un'applicazione client di boost :: program_options' IMHO. –

+2

Mi sono imbattuto in situazioni del genere e di solito le associo ad alcune opzioni enum di "esecuzione del programma". Prima cerco le impostazioni delle opzioni per questo e dopo averlo determinato, procedi con le opzioni specifiche ... –

risposta

17

Si dovrebbe iniziare con un qualche tutorial [1][2] per capire come funziona boost::program_options.

Quindi, è possibile definire due opzioni che si escludono reciprocamente semplicemente definendo una piccola funzione come spiegato in real.cpp. Ad esempio, è possibile specificare due in conflitto (o seconda) opzioni di definire una funzione conflicting_options():

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

e quindi chiamando

conflicting_options (vm, "quiet", "verbose"); 

subito dopo boost::program_options::store()

Non ho ancora capito se si tratta di possibile definire due opzioni posizionali che si escludono a vicenda, ma questa dovrebbe essere un'altra domanda.

+3

Secondo me è tanto il codice boilerplate! Perché non potenziare il supporto di gruppi mutuamente esclusivi come argparse di Python lo fa? – Asalle

+0

Python è quasi sempre più conciso di C++, è sempre stato. C++ 11/14/17 stanno andando avanti in questa direzione, ma il ritmo è lento. – Avio

Problemi correlati