Я не уверен, что это то, чего нужно, я использовал генераторы кода для создания кода C ++.
В частности, питонские гепарды. Вы в основном встраиваете прямой код Python в код C ++ и запускаете его через preprocessor.it cheetah, что позволяет выполнять довольно сложные вычисления гораздо проще, чем с помощью шаблонов или препроцессора C ++, плюс вы получаете все библиотеки и расширения Python. с другой стороны, это затрудняет отладку, если что-то пойдет не так. Если вы заинтересованы, я мог бы предоставить несколько примеров и режим Emacs для редактирования программ на гепарде C ++.
Если вам нужно что-то менее мощное и вы хотите остаться только в C ++ C, взгляните на препроцессор boost, здесь . Требуется немного времени, чтобы привыкнуть к нему, но это может сделать жизнь по-настоящему легкой, если задействован повторяющийся код
хорошо, я вставляю пример с гепардами, дай мне несколько минут:
#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
}
производит (после запуска 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);
}
, который является обычным кодом C ++
строки, начинающиеся с%, интерпретируются препроцессором cheetah как операторы python.
/// комментарии гепарда. По умолчанию # используется как операторы python, но я изменил их, чтобы избежать коллизий с директивами препроцессора Си. %end
должен использоваться для завершения блоков Python. Переменные в коде C ++, которые начинаются с $, заменяются переменными python.
Хотите примеры использования препроцессора boost?