, как предположил Нед, Cog - отличный инструмент для написания шаблонного кода. Например, мне пришлось написать поддержку системы событий в стиле AOP для определенных классов, чтобы она работала так:
- вы объявляете метод для класса
- для каждого метода событие должно вызываться при вызове, передавая аргументы метода в качестве параметров события
Итак, я сделал специальную функцию объявления python, которую я бы вызывал в области cog, которая генерировала бы стандартные объявления и определения для каждого метода и события. В конце области cog пользователь помещает блок кода для функции, которая скрывает реализацию и вызывается оболочкой AOP, примерно так:
class MyFoo
{
public:
/*[[[cog
import myAOPDeclarators
AOP = myAOPDeclarators.AOP
AOP.declareAOPInterceptorMethod( 'invokeSomeStuff' , '(int param1, std::string param2)' )
]]]*/
//AOP wrapper
void invokeSomeStuff_ImplementationAOP(int param1, std::string param2);
void invokeSomeStuff(int param1, std::string param2) {
sendAOPPreEvent( param1 , param2 , "invokeSomeStuff" );
invokeSomeStuff_ImplementationAOP( param1 , param2);
}
void invokeSomeStuff_ImplementationAOP(int param1, std::string param2)
//[[[end]]]
{
// ...invokeSomeStuff implementation, not automatically generated
}
Лучшее руководство для генерации кода, которое я могу вам дать; сделает ваш сгенерированный код таким же читабельным, как и написанный вами от руки . Это делает использование генерации кода прозрачным (даже более прозрачным, чем код шаблона, покупайте YMMV). Конечно, как предположил Грег, отступ может быть применен впоследствии, так что на самом деле нет смысла тратить время на смешивание операций над отступами с генерацией кода. если инструмент может обработать исходные файлы в любом случае