L'aide BOOST_PP_AUTO_REC
déduit le niveau de récursivité utilisé dans Automatic Recursion, en effectuant une recherche binaire à l'aide d'un prédicat. Le premier argument est le prédicat et le second est la taille à rechercher. Le prédicat sera appelé pred(n)
, où pred
est le prédicat et n
est la valeur.
La recherche doit être commandé, donc toutes les valeurs pour lesquelles le prédicat renvoie 0 doit précéder toutes les valeurs pour lesquelles le prédicat renvoie 1.
Depuis, la macro est utilisée pour Automatic Recursion, le prédicat ne peut pas utiliser macro qui utilise la récursion automatique.
Par exemple, le prédicat de répétition est défini comme suit:
# define BOOST_PP_REPEAT_P(n) BOOST_PP_CAT(BOOST_PP_REPEAT_CHECK_, BOOST_PP_REPEAT_ ## n(1, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3, BOOST_PP_NIL))
#
# define BOOST_PP_REPEAT_CHECK_BOOST_PP_NIL 1
# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_1(c, m, d) 0
# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_2(c, m, d) 0
# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_3(c, m, d) 0
Donc, si BOOST_PP_REPEAT_1
est appelé récursive, il ne se développe pas. Ainsi, quand il se cache avec BOOST_PP_REPEAT_CHECK_
il s'étendra à BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_1
, qui s'étendra à 0
. Toutefois, si BOOST_PP_REPEAT_1
n'est pas appelé de manière récursive, il s'étendra à BOOST_PP_NIL
, qui est ensuite concaténé avec BOOST_PP_REPEAT_CHECK_
pour produire 1
. Le prédicat est donc configuré pour détecter si l'une des macros BOOST_PP_REPEAT_n
peut se développer. Puis BOOST_PP_AUTO_REC
effectuera une recherche binaire pour trouver le premier qui peut se développer. Dans le cas de BOOST_PP_REPEAT
, il ne recherchera que 4 niveaux de récursivité, mais d'autres macros telles que BOOST_PP_WHILE
ont une profondeur de récursivité jusqu'à 256.
Paul Fultz Merci pour votre réponse. C'est clair pour moi maintenant. Malheureusement pas encore complètement. Peut-être que je manque l'acier. Par exemple: Dans la déclaration de coup de pouce que nous avons #define BOOST_PP_ENUM BOOST_PP_CAT (BOOST_PP_ENUM_, BOOST_PP_AUTO_REC (BOOST_PP_REPEAT_P, 4)) le BOOST_PP_CAT (BOOST_PP_ENUM_, BOOST_PP_AUTO_REC (BOOST_PP_REPEAT_P, 4)) étend toujours BOOST_PP_ENUM_1 Alors, pourquoi tout ne pas déclarer #define BOOST_PP_ENUM BOOST_PP_ENUM_1 –
Si 'BOOST_PP_ENUM' est appelée à partir d'une macro' BOOST_PP_REPEAT' il ne se développe pas à 'BOOST_PP_ENUM_1' comme dans l'exemple ici: http://www.boost.org/doc/libs /1_61_0/libs/preprocessor/doc/AppendixA-AnIntroductiontoPreprocessorMetaprogramming.html#horizontal-repetition –
Paul Fultz encore merci. J'ai tout compris entièrement à cause de votre explication. –