He estado usando metaprogramación bastante, pero a veces la combinación de macros y plantillas c simplemente no es suficiente.¿Hay alternativas de metaprogramación en C++ además de plantillas?
supongo que el inconveniente sería potencialmente falta de compatibilidad entre plataformas si la plataforma metaprogramming es sólo para, por ejemplo, Linux, etc.
Así que sí, ¿existe tal cosa disponible en este momento, además de plantillas? La metaprogramación de la búsqueda de Google está dominada por la metaprogramación de plantillas, por lo que es difícil de encontrar en este momento ...
edit: aquí hay un ejemplo de algo en lo que he estado trabajando.
Supongamos que tengo una clase genérica para guardar/cargar archivos en y desde búferes. Llamémoslo FilePack.
Tengo un definen macro, que se parece a
defineFilePack(BaseClass, "code-a")
Básicamente crea una clase llamada "BaseClassPack", que se define como una subclase. Debajo está esa cosa.
class FilePack{
public:
char * thebuffer;
int bufsize;
string packcode;
// and constructors etc
FilePack(const string& thecode, int bufsize);
void operator=(FilePack& rhs);
void saveToFile(const string& filename);
void loadFromFile(const string& filename);
// .. and all the function you'd expect to see in a class like this
};
// the person details
class PersonDetails{
public:
solidstring<64> name;
int age;
DateTime birthday;
// .. yada yada yada
};
defineFilePack(PersonDetails, "psd")
// the above creates the following class
class PersonDetailsPack : public FilePack{
public:
PersonDetailsPack():
FilePack("psd", sizeof(PersonDetails)){ // etc
}
PersonDetails& get(){
return *(PersonDetails*)getBuffer();
}
// and a lot more convenience function
};
Ahora, hay en realidad un cheque en-construido por el constructor de FilePack que el código declarado coincida con el tamaño, el uso de un mapa global.
En este momento estoy perplejo sobre cómo hacer eso mediante la metaprogramación de plantillas, que en realidad es una buena opción porque todos estos códigos de paquete de archivos están declarados dentro del archivo fuente. Claro, alguien probablemente pueda hacer su propio FilePack en tiempo de ejecución, pero eso es además del punto.
Otra cosa con la que la metaprogramación podría ayudar es respaldar la carga de diferentes versiones de FilePack. Supongamos que tengo que actualizar la clase PersonDetails. Solo hago una nueva clase, uso algún tipo de metaprogramación para declarar la herencia y, por arte de magia, hago que FilePack sepa que cuando está cargando una versión anterior de PersonDetails puede llamar a la función de conversión, o lo que sea.
Además, le invitamos a comentar sobre esa arquitectura, y me gustaría escuchar algún comentario al respecto, pero podría estar un poco fuera de tema?
¿Puede darnos un ejemplo de algo donde las plantillas + macros no son suficientes? Este sería un buen punto de partida para la discusión. –
@David Rodriguez: por ejemplo, genera código que serializa clases a través de una conexión de red o que, en general, hace algo por cada miembro. – 6502
"pero a veces la combinación de macros y plantillas c simplemente no es suficiente" - ¿qué es lo que falta/no es suficiente? – Naveen