se si consente l'utilizzo di Cog nel progetto, il codice diventa più leggibile:
/*[[[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]]]
Dopo aver eseguito cremagliera su questo file, si otterrà:
/*[[[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]]]
È anche possibile sposta le tue definizioni in file .py separati e la sezione cog sarà simile a:
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]]]
il principale vantaggio di utilizzare COG è che si guadagna il controllo completo della tua generazione del codice, completamente evitare pasticci illeggibili utilizzando preprocessore spinta o roba come quello.
lo svantaggio principale è che si aggiunge una nuova dipendenza strumento al progetto, anche perché è necessario avvolgere il suo utilizzo nei commenti con i marcatori di sezione cog, potrebbe effettivamente essere peggio di scrivere manualmente il codice per piccoli utilizzi. Si ripaga quando è necessario dichiarare grandi enumerazioni o sacco di codice inevitabile boilerplate
possibile duplicato del [C++ macro problema (interpretazione del comma,)] (http: // StackOverflow.it/questions/5348077/c-macro-problema-interpretazione-di-virgola) –
@OliCharlesworth Ah, non l'ho trovato nella mia ricerca. La risposta non sembra rispondere al mio esatto problema, sebbene fornisca qualche spunto di riflessione. Grazie. – chrisaycock
Una domanda più recente ha alcune risposte eccellenti: http://stackoverflow.com/questions/13842468/comma-in-cc-macro/13842784#13842784 – jjrv