Así que tengo este gran árbol que es básicamente un gran interruptor/caja con teclas de cadena y diferentes llamadas de función en un objeto común dependiendo de la clave y una pieza de metadatos.Metaprogramación C/C++ utilizando el preprocesador
Cada entrada básicamente se parece a esto
} else if (strcmp(key, "key_string") == 0) {
((class_name*)object)->do_something();
} else if (...
donde do_something
puede tener diferentes invocaciones, por lo que no se puede simplemente utilizar los punteros de función. Además, algunas claves requieren que el objeto sea lanzado a una subclase.
Ahora, si tuviera que codificar esto en un lenguaje de nivel superior, usaría un diccionario de lambdas para simplificar esto.
Se me ocurrió que podía usar macros para simplificar esto a algo así como
case_call("key_string", class_name, do_something());
case_call(/* ... */)
donde case_call
habría una macro que ampliaría este código para el primer fragmento de código.
Sin embargo, estoy muy en la cerca si eso se consideraría un buen estilo. Quiero decir, reduciría el trabajo de tipeo y mejoraría el DRYness del código, pero realmente parece abusar un poco del sistema macro.
¿Seguirías por ese camino o escribirías todo? ¿Y cuál sería tu razonamiento para hacerlo?
Editar
Algunas aclaraciones:
Este código se utiliza como una capa de pegamento entre un API scripting simplificado que accede a varios aspectos diferentes de un C++ API propiedades como simples clave-valor. Sin embargo, las propiedades se implementan de diferentes maneras en C++: algunas tienen métodos getter/setter, algunas se establecen en una estructura especial. Las acciones de scripts hacen referencia a objetos de C++ convertidos en una clase base común. Sin embargo, algunas acciones solo están disponibles en ciertas subclases y deben ser eliminadas.
Más adelante en el camino, puedo cambiar la API de C++ real, pero por el momento, debe considerarse como inalterable. Además, esto tiene que funcionar en un compilador integrado, por lo que boost o C++ 11 (lamentablemente) no están disponibles.
¿Por qué los votos para cerrar? Esta es una muy buena pregunta válida. ¿Que me estoy perdiendo aqui? –
Es una buena pregunta, pero "Esta pregunta no encaja bien en nuestro formato de preguntas y respuestas. Esperamos que las respuestas generalmente incluyan hechos, referencias o experiencia específica; * esta pregunta probablemente solicitará opinión, debate, argumentos, encuestas o ampliaciones discusión. * " – Fanael
Ya está en el puntaje de +5, por lo que un poco dice que otros, yo incluido, están interesados en el resultado. La respuesta a continuación ya es bastante agradable. –