C Präprozessor, Makro "Überladen"

Ich versuche eine Art Makro "Überladen" zu machen, damit MACRO (etwas) anders erweitert wird als MACRO (etwas anderes).

Mit einem Ausschnitt, den ich von @ bekommen haHie (Ich bin mir nicht sicher, ob es 100% portabel ist) und einige Funktionen aus der Boost PP Library, ich konnte es zum Laufen bringen: 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)

etzt fehlen mir noch zwei andere Dinge, die ich tun möchte:

(Dies ist mir eigentlich egal, wenn ich es nie löse.) Ich glaube, dass ein MAKRO geschrieben werden kann, das, wenn man die Anzahl der 'Varianten' und die entsprechende 'Ausgabe' aufnimmt, einen Code erzeugt, der dem obigen ähnlich ist. So etwas wie TEMPLATE (3, function_A (...), function_B (...), function_C (...)), um das obige Beispiel zu generieren.

Was passiert, wenn TEST () ohne Argumente aufgerufen wird? Nun, VA_NARGS wird auf 1 erweitert. Das erste Argument ist jedoch "" (nichts). Ich versuche einen Weg zu finden, um entweder 'Null'-Argumente in @ zu erkenne__VA_ARGS__ oder um zwischen einem Null-Argument und einem echten zu unterscheiden, um die Überladungsfunktion zu erweitern, um auf diese Situation zu reagieren. Irgendwelche Ideen

Antworten auf die Frage(2)

Ihre Antwort auf die Frage