No estoy seguro de que esto sea lo que debería querer, he usado generadores de código para producir código C++. En particular, pitón guepardo. Básicamente insertas código python dentro de tu código C++ y ejecutas el preprocesador cheetah. Esto permite hacer cálculos bastante complejos mucho más fácil que usar plantillas o preprocesador C++, además de obtener todas las extensiones y extensiones de python. por otro lado, hace que la depuración sea más difícil si algo sale mal. Si está interesado, podría proporcionar algunos ejemplos y el modo Emacs para editar programas Cheetah C++.
Si necesita algo menos potente y desea mantenerse dentro de C++ C solamente, eche un vistazo al preprocesador de impulso, here. Se necesita un poco de tiempo para acostumbrarse a él, pero podría hacer la vida muy fácil cuando el código repetitivo participa
bien, estoy pegando ejemplo guepardo, dame unos minutos:
#if defined (__INTEL_COMPILER)
#pragma vector aligned
#endif
for(int a = 0; a < $N; ++a) {
/// for functions in block
%for ii, (fi,fj) in enumerate(fb)
%set i = ii + ifb
/// can also use (ix,iy,iz)=fi[0:2], need to clean up when not lazy
%set ix = fi[0]
%set iy = fi[1]
%set iz = fi[2]
%set jx = fj[0]
%set jy = fj[1]
%set jz = fj[2]
q$(i) += Ix(a,$(ix),$(jx))*Iy(a,$(iy),$(jy))*Iz(a,$(iz),$(jz));
%end for
/// end for functions in block
}
produce (después de ejecutar cheetah ...
)
#if defined (__INTEL_COMPILER)
#pragma vector aligned
#endif
for(int a = 0; a < 6; ++a) {
q0 += Ix(a,0,1)*Iy(a,0,0)*Iz(a,0,0);
q1 += Ix(a,1,1)*Iy(a,0,0)*Iz(a,0,0);
q2 += Ix(a,0,1)*Iy(a,1,0)*Iz(a,0,0);
q3 += Ix(a,0,1)*Iy(a,0,0)*Iz(a,1,0);
q4 += Ix(a,0,0)*Iy(a,0,1)*Iz(a,0,0);
q5 += Ix(a,1,0)*Iy(a,0,1)*Iz(a,0,0);
q6 += Ix(a,0,0)*Iy(a,1,1)*Iz(a,0,0);
q7 += Ix(a,0,0)*Iy(a,0,1)*Iz(a,1,0);
q8 += Ix(a,0,0)*Iy(a,0,0)*Iz(a,0,1);
q9 += Ix(a,1,0)*Iy(a,0,0)*Iz(a,0,1);
}
que es un C normal ++ código
líneas que comienzan con% se interpretan como declaraciones pitón por pre guepardo procesador. /// son comentarios de guepardo. Los valores predeterminados usan # como instrucciones python, pero las cambié para evitar colisiones con las directivas del preprocesador C. %end
se debe usar para terminar bloques Python. Las variables en código C++ que comienzan con $ son reemplazadas por variables de python.
¿Desea ejemplos con el preprocesador de impulso?
¿Qué tipo de cosas está tratando de generar o calcular? Estructuras? Funciones de línea recta? ¿Código de espagueti? Máquinas de estado? – Potatoswatter