, если вы разрешите использование Cog в вашем проекте, ваш код станет более читабельным:
/*[[[cog
# definitions ----
import cog
def AddDeclaration( templateArg , restOfDeclaration ):
cog.outl(' %s struct %s; ' % (templateArg , restOfDeclaration))
# generation ---
types = ['bool' , 'std::string']
names = ['Foo' , 'Bar']
for index in range(len(names)):
AddDeclaration( 'template<int, %s>' % types[index] , names[index])
]]]*/
//[[[end]]]
После запуска cog над этим файлом вы получите:
/*[[[cog
# definitions ----
import cog
def AddDeclaration( templateArg , restOfDeclaration ):
cog.outl(' %s struct %s; ' % (templateArg , restOfDeclaration))
# generation ---
types = ['bool' , 'std::string']
names = ['Foo' , 'Bar']
for index in range(len(names)):
AddDeclaration( 'template<int, %s>' % types[index] , names[index])
]]]*/
template<int, bool> struct Foo; <---------------- generated by Cog!!
template<int, std::string> struct Bar;
//[[[end]]]
Вы даже можете переместить свои определения в отдельные файлы .py, и раздел cog будет выглядеть так:
declarations.py
import cog
def AddDeclaration( templateArg , restOfDeclaration ):
cog.outl(' %s struct %s; ' % (templateArg , restOfDeclaration))
my.h
/*[[[cog
# definitions ----
import declarations
# generation ---
types = ['bool' , 'std::string']
names = ['Foo' , 'Bar']
for index in range(len(names)):
AddDeclaration( 'template<int, %s>' % types[index] , names[index])
]]]*/
template<int, bool> struct Foo;
template<int, std::string> struct Bar;
//[[[end]]]
главное преимущество использования cog заключается в том, что вы получаете полный контроль над генерацией кода, полностью избегая нечитаемых беспорядков, используя препроцессор boost или тому подобное.
основным недостатком является то, что вы добавляете новую зависимость от инструмента в свой проект, также, поскольку вам нужно обернуть его использование в комментариях маркерами секции cog, это может быть на самом деле хуже, чем писать код вручную для небольших случаев использования. Это действительно окупается, когда вам нужно объявить большое число или много неизбежного шаблонного кода