Acho que isso não é possível, mas pergunto mesmo assim.
Dada uma macro x como a seguinte:
#define X_TABLE(_)\
_(1, a, "hi")\
_(2, b, "hello")\
_(3, c, "sup")
// ...
#define X(_1, _2, _3) SomeFunc(_1, _2, _3);
X_TABLE(X)
#undef X
O acima geraria:
SomeFunc(1, a, "hi");
SomeFunc(2, b, "hello");
SomeFunc(3, c, "sup");
Existe uma maneira de pular algumas linhas de X_TABLE
na avaliação de X
, de modo que SomeFunc
não seja gerado para essa linha?
Talvez, gere algo assim:
SomeFunc(1, a, "hi");
SomeFunc(3, c, "sup");
Isenção de responsabilidade:
Macros X são uma técnica antiga introduzida na programação C.
Como as macros são independentes de namespaces e escopos, elas podem ser responsáveis por efeitos estranhos e inesperados em C++. (Em C, esse problema não existe devido à ausência de classes e namespaces.)
No entanto, (pelo menos até o C++20) há alguns casos de uso que ainda não podem ser cobertos por nada além de macros — ou seja, técnicas que se baseiam no operador stringify.
Macros X condicionais:
Em relação ao uso condicional de linhas em macros X por OPs, a seguinte solução é possível: a introdução de uma ou mais colunas adicionais com condições. Essas colunas adicionais são usadas (em combinação com a colagem de tokens) para criar nomes de macros. Portanto, algumas linhas podem (ou não) ser usadas para expandir para um texto diferente de outras.
Um exemplo para ilustrar isso:
Saída:
Demonstração no coliru
Versões mais recentes dos padrões C++ e C suportam
__VA_OPT__
. Você pode usar isso para introduzir um quarto token pp à lista, habilitando um comportamento especial:Pré-processado: