Pregunta

Estoy tratando de hacer algún tipo de macro "sobrecarga", de manera que MACRO (algo), obtiene ampliado de manera diferente que MACRO (algo que, de lo contrario).

El uso de un fragmento que me dieron de aquí (soy no estoy seguro si es 100% portátil) y algunas funciones de la biblioteca Boost PP, yo era capaz de 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 me faltan otras dos cosas que quiero hacer:

  1. (Éste realmente no me importa si no lo resuelvo) Creo que una macro se puede escribir que cuando se toma el número de 'variantes' y su corresponsal 'de salida' genera un código como similares la de arriba. Algo así como PLANTILLA (3, funcion_a (...), funcion_b (...), funcion_c (...)) para generar el ejemplo anterior.

  2. ¿Qué pasa cuando test () se llama sin argumentos? Bueno, VA_NARGS expande a 1. Sin embargo, el primer argumento es "" (nada). Estoy tratando de encontrar una manera de detectar ya sea 'cero' argumentos en __VA_ARGS__ o para diferenciar entre un argumento 'nulo' y uno real, con el fin de ampliar la función de 'sobrecarga' para reaccionar ante esta situación. Algunas ideas?

¿Fue útil?

Solución

Para responder a su pregunta 2 en primer lugar. Sí, con macros variadic también es posible detectar una lista de argumentos vacía. La explicación es un poco largo, lo he escrito arriba aquí . Debería ser relativamente fácil de combinar este método con las macros de impulso que está utilizando.

En su pregunta 1, sí, esto también es posible. Boost tiene algunas macros iterador que se acercan a esto, creo, pero se ven un poco de miedo de usar. Si he entendido bien lo que tiene que usar algo como listas anidadas (a, (b, (c,d))), no muy conveniente.

(I escribió un conjunto de macros que pueden lograr esto de manera más directa, pero desafortunadamente el paquete aún no está listo para el lanzamiento. Contacto conmigo en privado si es realmente interesado en él.)

Editar El href="http://p99.gforge.inria.fr/" rel="nofollow noreferrer"> paquete P99

scroll top