2012-05-07 10 views
16

Sto scrivendo un programma che utilizza la libreria di Opzioni programma di Boost e ho notato la seguente sintassi che mi ha ossessionato da quando l'ho visto:Boost Opzioni programma Aggiungi opzioni Sintassi

desc.add_options() 
     ("help","produce help message") 
     (/* other flag, value, description pairs here */) 
; 

vedo che nell'intestazione, l'operatore() è sovrascritto, ma non sono sicuro di come ciò possa essere sintatticamente corretto.

In secondo luogo, c'è qualche vantaggio in questa sintassi, rispetto alla semplice chiamata di add_options() più volte (oltre a mostrare il fatto che è possibile manipolare la sintassi in questo modo)?

+5

Gli autori Boost amano mettersi in mostra ... –

+0

"Haunted" è una buona descrizione ... L'ho capito formalmente, ma "si sente" strano ... – thomastiger

risposta

16

La funzione membro add_options restituisce un oggetto di tipo options_description_easy_init. Quest'ultimo ha un sovraccarico di operator() per restituire un riferimento a se stesso. Ciò ti consente di concatenare le chiamate come hai mostrato nello snippet.

La differenza tra concatenamento le chiamate e chiamare add_options più volte è che nel primo caso viene creata una singola istanza di options_description_easy_init e ogni volta che si richiama operator() su di esso, aggiunge le opzioni per il proprietario (options_description). Se dovessi chiamare add_options più volte ogni chiamata creerebbe una nuova istanza di options_description_easy_init.

+1

+1 per come, ma chiede ancora il domanda: perché? – paulrehkugler

+0

@paulrehkugler Nicol's [risposta] (http://stackoverflow.com/a/10487655/241631) spiega perché – Praetorian

12

La domanda di vantaggio è soggettiva, ma in questo caso è brevità.

paragonare questo da uno dei miei progetti a casa:

("help,h", "Generate this help message") 
("output-file,o", po::value<std::string>(), "Output filename. Required.") 
("tangent,t", "Generate/load tangent-space basis.") 
("collada-output,c", "Write a Collada file, rather than our mesh XML format.") 
("arrays,a", "Write arrays instead of indexed verts. Cannot combine with Collada writing.") 
("flip-tangent,f", "Change the tangent-space basis matrix's handedness. Negates bitangent.") 
("map", po::value<std::string>(), "Map filename. Defaults to the ColladaConv directory's 'stdmap.txt' file.") 
("vao", po::value<std::vector<std::string> >(), "Sequence of mappings, of the form:\n" 
     "Name # # # #\n" 
     "\n" 
     "Each # is an attribute index to use for this VAO.\n" 
     "Each VAO name must be unique; you cannot use the same VAO in the same place.") 

a questo:

visible.add_options()("help,h", "Generate this help message") 
visible.add_options()("output-file,o", po::value<std::string>(), "Output filename. Required.") 
visible.add_options()("tangent,t", "Generate/load tangent-space basis."); 
visible.add_options()("collada-output,c", "Write a Collada file, rather than our mesh XML format."); 
visible.add_options()("arrays,a", "Write arrays instead of indexed verts. Cannot combine with Collada writing."); 
visible.add_options()("flip-tangent,f", "Change the tangent-space basis matrix's handedness. Negates bitangent."); 
visible.add_options()("map", po::value<std::string>(), "Map filename. Defaults to the ColladaConv directory's 'stdmap.txt' file."); 
visible.add_options()("vao", po::value<std::vector<std::string> >(), "Sequence of mappings, of the form:\n" 
     "Name # # # #\n" 
     "\n" 
     "Each # is an attribute index to use for this VAO.\n" 
     "Each VAO name must be unique; you cannot use the same VAO in the same place."); 

questioni lunghezza della linea. E non dover avere visible.add_options() di fronte a tutto rende più facile la lettura.

+0

sospettavo che fosse l'unico vantaggio. A mio parere, è un bel po 'di lavoro in più per rendere il codice più carino. – paulrehkugler

+0

Entrambi gli esempi sono piuttosto orribili. Potresti definire 'options_description_easy_init o = visible.add_options()' e semplicemente chiamare 'o (" help "," Genera questo messaggio di aiuto ");'? – Vortico

+0

@Vortico: Non vedo nulla di particolarmente spiacevole nel primo caso. In effetti, non vedo quale sia il tuo suggerimento come vantaggio rispetto al primo, anche se funziona. Non so se lo farà; dovresti controllare la documentazione di Boost per vedere. Ma generalmente, non è una buona idea mantenere gli intermediari da costrutti come questo. –

Problemi correlati