C Preprocesador, macro "sobrecarga"

Estoy tratando de hacer algún tipo de "sobrecarga" de macros, para que MACRO (algo) se expanda de manera diferente a MACRO (algo más).

Usando un fragmento que obtuve deaquí (No estoy seguro si es 100% portátil) y algunas funciones de la biblioteca Boost PP, pude hacer que funcione: 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)

Ahora todavía me faltan otras dos cosas que quiero hacer:

(Este no me importa si nunca lo resuelvo) Creo que se puede escribir un MACRO que al tomar el número de 'variantes' y su 'salida' correspondiente genera un código similar al anterior. Algo así como TEMPLATE (3, function_A (...), function_B (...), function_C (...)) para generar el ejemplo anterior.

¿Qué sucede cuando se llama a TEST () sin argumentos? Bueno, VA_NARGS se expande a 1. Pero el primer argumento es "" (nada). Estoy tratando de encontrar una manera de detectar argumentos 'cero' en__VA_ARGS__ o para diferenciar entre un argumento 'nulo' y uno real, a fin de extender la función de 'sobrecarga' para reaccionar ante esta situación. ¿Algunas ideas?

Respuestas a la pregunta(1)

Su respuesta a la pregunta