2012-05-07 8 views
16

Estoy escribiendo un programa que utiliza la biblioteca opciones de programa de Boost y me di cuenta de lo siguiente sintaxis que me ha perseguido desde que lo vi:impulsará programa Opciones Añadir opciones de sintaxis

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

veo que en la cabecera, el operador() está anulado, pero no estoy seguro de cómo eso permite que esto sea sintácticamente correcto.

En segundo lugar, ¿hay alguna ventaja en esta sintaxis, en comparación con simplemente llamar a add_options() varias veces (además de mostrar el hecho de que puede manipular la sintaxis de esta manera)?

+5

A los autores de Boost les gusta presumir ... –

+0

"Haunted" es una buena descripción ... Lo entiendo formalmente, pero "se siente" raro ... – thomastiger

Respuesta

16

La función de miembro add_options devuelve un objeto del tipo options_description_easy_init. Este último tiene operator() sobrecargado para devolver una referencia a sí mismo. Esto le permite encadenar las llamadas como lo ha mostrado en el fragmento.

La diferencia entre el encadenamiento de las llamadas y llamar a add_options varias veces es que en el primer caso se crea una instancia única de options_description_easy_init y cada vez que invoque operator() en él, que añade las opciones para el propietario (options_description). Si tuviera que llamar al add_options varias veces, cada llamada crearía una nueva instancia de options_description_easy_init.

+1

+1 para el cómo, pero aún mendiga el pregunta: ¿por qué? – paulrehkugler

+0

@paulrehkugler Nicol's [respuesta] (http://stackoverflow.com/a/10487655/241631) explica por qué – Praetorian

12

La pregunta de ventaja es subjetiva, pero en este caso es brevedad.

Compare esto desde uno de mis proyectos en el hogar:

("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 esto:

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

asuntos longitud de la línea. Y no tener que tener visible.add_options() delante de todo hace que sea más fácil de leer.

+0

sospechaba que era la única ventaja. En mi opinión, eso es un poco más de trabajo para simplemente hacer un código más bonito. – paulrehkugler

+0

Ambos ejemplos son bastante horribles. ¿Podrías definir 'options_description_easy_init o = visible.add_options()' y simplemente llamar a 'o (" help "," Generate this help message ");'? – Vortico

+0

@Vortico: no veo nada desagradable sobre el primer caso. De hecho, no veo lo que su sugerencia tiene como beneficio sobre el primero, incluso si funciona. No sé si lo hará; tendrías que verificar la documentación de Boost para ver. Pero, en general, no es una buena idea mantener intermedios de construcciones como esta. –

Cuestiones relacionadas