Frage

Ich versuche, eine Art von Makro "Overloading" zu tun, so dass MACRO (etwas), wird anders erweitert als MACRO (etwas, anderes).

Mit einem Snippet ich von bekam hier (ich bin nicht sicher, ob es 100% tragbar ist) und einige Funktionen aus der Boost-PP-Bibliothek konnte ich es funktioniert: D

//THESE TWO COUNT THE NUMBER OF ARGUMENTS
#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)

//THIS ONE RETURNS THE PARAMETER AT POSITION _i FROM A LIST OF __VA_ARGS__
#define VA_ARG(_i, ...) BOOST_PP_ARRAY_ELEM(_i, (VA_NARGS(__VA_ARGS__), (__VA_ARGS__)))

//AND THIS ONE IS THE 'OVERLOADED' MACRO ;)
#define TEST(...) BOOST_PP_IF(BOOST_PP_EQUAL(1, VA_NARGS(__VA_ARGS__)), function_A(VA_ARG(0, __VA_ARGS__)), \ //1 parameter
                  BOOST_PP_IF(BOOST_PP_EQUAL(2, VA_NARGS(__VA_ARGS__)), function_B(VA_ARG(0, __VA_ARGS__) + VA_ARG(1, __VA_ARGS__)), \ //2 parameters
                  BOOST_PP_IF(BOOST_PP_EQUAL(3, VA_NARGS(__VA_ARGS__)), function_C(VA_ARG(1, __VA_ARGS__) + VA_ARG(2, __VA_ARGS__)), BOOST_PP_EMPTY())) // 3 parameters and so on ...

So       TEST(a) = function_A(a)
      TEST(a, b) = function_B(a + b)
   TEST(a, b, c) = function_C(b + c)

Jetzt bin ich noch zwei andere Dinge fehlen, die ich tun möchte:

  1. (Dies ich nicht wirklich egal, ob ich es nie lösen) Ich glaube, dass ein Makro geschrieben werden kann, dass bei Aufnahme die Anzahl von ‚Varianten‘ und sein Korrespondent ‚Output‘ erzeugt einen Code ähnlich wie die obige. So etwas wie TEMPLATE (3, functiona (...), function_B (...), function_C (...)) zu erzeugen, das obige Beispiel.

  2. Was passiert, wenn TEST () ohne Argumente aufgerufen wird? Nun, VA_NARGS erweitert zu 1. Aber das erste Argument ist „“ (nichts). Ich versuche, einen Weg zu finden, um entweder ‚Null‘ Argumente in __VA_ARGS__ zu erkennen oder zwischen einem ‚Null‘ Argumente und einem wirklichen, um zu unterscheiden, die ‚Überlastung‘ Funktion zu erweitern, um diese Situation zu reagieren. Irgendwelche Ideen?

War es hilfreich?

Lösung

Ihre Frage 2 zuerst zu beantworten. Ja, mit variadische Makros ist es auch möglich, eine leere Argumentliste zu erkennen. Die Erklärung ist ein bisschen lang, ich habe es geschrieben hier . Es sollte relativ einfach sein, diesen Ansatz mit dem Boost-Makros zu kombinieren, dass Sie verwenden.

Für Ihre Frage 1, ja das ist auch möglich. Boost hat einige Iterator-Makros, die nahe an diese kommen, glaube ich, aber sie sehen ein bisschen beängstigend zu verwenden. Wenn ich richtig verstehe, müssen Sie so etwas wie verschachtelte Listen (a, (b, (c,d))) verwenden, nicht zu bequem.

(Ich schrieb eine Reihe von Makros, die diese mehr direkt erreichen kann, aber leider ist das Paket noch nicht zur Veröffentlichung bereit. Kontaktieren Sie mich privat, wenn Sie wirklich in ihm interessiert.)

Edit: Das P99 Paket wird in der Zwischenzeit veröffentlicht und enthält eine Menge Material über Makro „Überlastung“ und geben Sie generische Makros.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top