Supposons que j'ai une macroComment puis-je invoquer une macro avec tous les points d'un produit catersien d'ensembles d'arguments?
FOO(a, b)
et je veux invoquer cette macro avec un certain (fixe) de valeurs possibles pour a
; et un certain ensemble fixe de valeurs pour b
. Ainsi, si mon ensemble de valeurs b est bar
et baz
et mon ensemble de valeurs b est fiz
et bang
, je veux:
FOO(bar, fiz)
FOO(bar, bang)
FOO(baz, fiz)
FOO(baz, bang)
séparés soit par de nouvelles lignes, soit par des points-virgules, ou les deux - c'est un problème mineur si ignorons-le; l'ordre exact des 4 invocations n'est pas non plus important.
Maintenant, si je n'avais qu'une « dimension » des paramètres, je pourrais utiliser William Swanson de mechanism (comme décrit ici sur le site, et il y a même un github repository pour elle), et écrire
MAP(SINGLE_PARAMETER_MACRO, bar, baz, quux)
à obtenir
SINGLE_PARAMETER_MACRO(bar)
SINGLE_PARAMETER_MACRO(baz)
SINGLE_PARAMETER_MACRO(quux)
mais la chose est, je deux dimensions; et il semble impossible/difficile de séparer votre __VA_ARGS__
en deux ensembles différents et de parcourir l'espace bidimensionnel des paires d'éléments de ces ensembles.
Est-ce que cela peut (raisonnablement) être fait?
Notes:
- Je suis intéressé par une solution à base de C-préprocesseur, mais si vous avez quelque chose qui ne fonctionne que dans C++ pour une raison étrange, c'est ok aussi.
- La solution doit être uniquement au moment de la compilation et doit être valide presque partout dans votre unité de traduction C/C++; spécifiquement, dans les définitions de classe et à la portée du fichier. Vous pouvez deviner que c'est un XY problem, et vous avez raison; mais s'il vous plaît ne choisissez pas à ma motivation puisque les deux X et Y sont à mon humble avis.
- Si vous pouvez maintenir un ordre lexicographique des invocations de macros, ce serait bien.
Je ne pense pas qu'il existe des mécanismes de bouclage dans le préprocesseur. Pourquoi ne pouvez-vous pas le faire dans une boucle d'exécution? – Barmar
@Barmar: 'FOO' peut être une déclaration ou une définition, pas une déclaration. Le préprocesseur admet un mécanisme de bouclage list-head-vs-tail - mais il n'est pas intrinsèquement multidimensionnel. – einpoklum
@WilliamSwanson: Peut-être en tant qu'auteur de la réponse connexe, vous pourriez avoir un conseil pour moi? – einpoklum