2016-09-26 5 views
1

j'ai rencontré à coup de fouet définirQue fait BOOST_PP_AUTO_REC?

# define BOOST_PP_ENUM BOOST_PP_CAT(BOOST_PP_ENUM_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4)) 

Quelqu'un pourrait-il expliquer ce que fait BOOST_PP_AUTO_REC? Aucune description dans la documentation. A quoi servent ces macros?

Répondre

1

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.

+0

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 –

+0

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 –

+0

Paul Fultz encore merci. J'ai tout compris entièrement à cause de votre explication. –