guia español c++ boost boost-program-options

c++ - español - manual de qgis 2.18 pdf



Sintaxis de las opciones del programa Boost Agregar opciones de sintaxis (2)

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

La diferencia entre encadenar las llamadas y llamar a add_options varias veces es que en el primer caso se crea una única instancia de options_description_easy_init y cada vez que invoca operator() , agrega las opciones al propietario ( options_description ). Si add_options llamar a add_options varias veces, cada llamada crearía una nueva instancia de options_description_easy_init .

Estoy escribiendo un programa que usa la biblioteca de Opciones de Programa de Boost y noté la siguiente sintaxis que me ha perseguido desde que lo vi:

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

Veo que en el encabezado, 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 solo llamar a add_options () varias veces (además de mostrar que se puede manipular una sintaxis como esta)?


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

Compara esto de uno de mis proyectos caseros:

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

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