Domanda

Sto cercando di fare una sorta di macro "sovraccarico", in modo che MACRO (qualcosa), viene ampliato in modo diverso rispetto MACRO (cosa, altro).

Utilizzando un frammento che ho ricevuto da qui (io sono non so se è al 100% portatile) e alcune funzioni dal Boost Biblioteca PP, sono stato in grado di farlo funzionare: 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)

Ora mi manca ancora altre due cose che voglio fare:

  1. (Questo non mi importa se non ho mai risolverlo) Credo che una macro può essere scritto che quando prende il numero di 'varianti' e il suo corrispondente 'uscita' genera un codice come simile questo. Qualcosa di simile MODELLO (3, function_A (...), function_B (...), function_C (...)) per generare l'esempio di cui sopra.

  2. Che cosa succede quando TEST () viene chiamato senza argomenti? Beh, VA_NARGS espande a 1. Ma il primo argomento è "" (niente). Sto cercando di trovare un modo per rilevare uno 'zero' argomenti a __VA_ARGS__ o di distinguere tra un argomento 'null' e uno reale, al fine di estendere la funzione di 'sovraccarico' di reagire a questa situazione. Tutte le idee?

È stato utile?

Soluzione

Per rispondere alla tua domanda 2 prima. Sì, con le macro variadic è anche possibile rilevare una lista di argomenti vuota. La spiegazione è un po 'lungo, ho scritto fino qui . Esso dovrebbe essere relativamente facile da combinare questo approccio con le macro spinta che si sta utilizzando.

Per la vostra domanda 1, sì, anche questo è possibile. Boost ha alcune macro iteratore che si avvicinano a questo, penso, ma sembrano un po 'paura di usare. Se ho capito bene che devi usare qualcosa come liste nidificate (a, (b, (c,d))), non troppo comodo.

(ho scritto un insieme di macro che possono raggiungere questo obiettivo in modo più diretto, ma purtroppo il pacchetto non è ancora pronto per il rilascio. mi contatti in privato se siete davvero interessati in esso.)

Modifica Il href="http://p99.gforge.inria.fr/" rel="nofollow noreferrer"> pacchetto

scroll top