Hallo,
mal angenommen folgendes Beispiel, das leider so stark vereinfacht ist, dass es gar keinen Sinn mehr macht, aber es geht um's Prinzip:
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#define SEQ (a)(b)(c)
// Folgendes geht, BOOST_PP_CAT wird ausgewertet:
#define MACRO(r, data, i, elem) BOOST_PP_CAT(elem, BOOST_PP_CAT(data, i))
BOOST_PP_SEQ_FOR_EACH_I(MACRO, _, SEQ) // wird zu: a_0 b_1 c_2
// Folgendes geht nicht:
#define INNEN(r, data, elem) hu
#define AUSSEN(r, data, i, elem) BOOST_PP_SEQ_FOR_EACH_I(INNEN, data ,SEQ)
BOOST_PP_SEQ_FOR_EACH_I(AUSSEN, _, SEQ) // soll werden zu: hu hu hu hu hu hu hu hu hu (Neun mal 'hu')
/* Wird stattdessen zu:
BOOST_PP_SEQ_FOR_EACH_I(INNEN, _ ,(a)(b)(c)) BOOST_PP_SEQ_FOR_EACH_I(INNEN, _ ,(a)(b)(c)) BOOST_PP_SEQ_FOR_EACH_I(INNEN, _ ,(a)(b)(c))
Das heißt: BOOST_PP_FOR_EACH_I wird nicht ausgewertet
*/
Zunächst mal meine Vermutung warum das nicht geht: Weil das Makro sich selbst aufruft.
Frage 1: Ist das richtig, dass die Verschachtelung von Makros ein Problem ist?
Frage 2, falls nein zu Frage 1: Was ist dann das Problem?
Frage 3, falls ja zu Frage 1: Was ist dann mit BOOST_PP_CAT(elem, BOOST_PP_CAT(data, i))?
Frage 4, falls ja zu Frage 1: Gibt's dafür eine Möglichkeit, trotzdem etwas in der Art zu machen? (Ich meine sowas wie Verschachtelung, dass ich huhuhuhuhu auch anders hinbekomme ist mir klar )
Mir fiele die Möglichkeit ein, die ganzen Boost Makros nochmals mit anderem Namen zu definieren und dann für die zweite Schleifenebene die umbenannten Versionen zu benutzen, aber das halte ich für unnötig umständlich.
Oder etwas einfacher, könnte ich meine eigene Version von BOOST_PP_SEQ_FOR_EACH_PRODUCT schreiben, die nicht die Einschränkungen hat, wegen derer ich es nicht verwenden will.
Wie ich gesehen habe verwendet BOOST_PP_SEQ_FOR_EACH_PRODUCT intern keine Verschachtelten Makros, deshalb befürchte ich, dass dies anders wohl nicht geht
Frage 5: Ist boost::preprocessor eigentlich auch "böse"?