2015-04-29 18 views
6

Ho una funzione inline variadic
inline int foo(...)
Ho bisogno foo() di chiamare una macro (chiamiamolo MACRO), che è anche variadic.
Fondamentalmente ho bisogno di foo() per passare tutti i suoi parametri di input a MACRO. Ridefinire foo() come un'altra macro sarebbe una soluzione semplice a causa dell'opzione __VA_ARGS__, ma ho anche bisogno di foo() per restituire un valore.
Nota: sto cercando di interfacciare due parti del codice già scritto e non sono autorizzato a modificarle. foo(...) viene utilizzato nella prima parte del codice e MACRO è definito nella seconda parte. L'unica cosa che dovrei fare è definire un foo() che usi MACRO e non posso perché sono entrambi variadici.Funzione Variadica chiamare un variadic macro

+0

È possibile utilizzare il modello variadico per 'pippo' anziché ellissi? – Jarod42

+0

Stai parlando di vararg o modelli di funzioni variadiche? Con uno il tuo problema può essere risolto, con l'altro non può. – Quentin

+4

Non può essere fatto. I parametri delle funzioni sono impostati in fase di esecuzione, i macro vengono espansi prima della compilazione. Butto via questo casino e cerco un modo ragionevole di fare qualunque cosa stia cercando di fare. –

risposta

1

Quello che chiedi è impossibile.

Gli argomenti di una funzione variad sono determinati in fase di esecuzione, ma una macro si espande in fase di compilazione.

+1

Impossibile? Questo è C++. – Yakk

+0

@Yakk È __is__ impossibile. Leggi di nuovo la sua domanda. 'pippo' deve essere una funzione, non una macro. – orlp

+0

"Perché' foo' deve restituire un valore. " Tutto ciò di cui abbiamo bisogno è una macro che restituisca un valore! Sacrifica 3 capre vergini sul marte solistizio e chiamami al mattino. Oppure, sai, evoca abomini con codice C++. O funziona. – Yakk

6

Effettuare foo una macro che contiene una lambda che restituisce un valore e quindi richiama quella lambda.

#define foo(...) \ 
    [&](auto&&...args){ \ 
    /* do something with args, or __VA_ARGS__ */ \ 
    MACRO(__VA_ARGS__); \ 
    return 7; \ 
    }(__VA_ARGS__) 

ora int x = foo(a, b, c); saranno entrambi chiamare lambda all'interno foo, e dentro che lambda chiamare la macro su (a, b, c), e possono restituire un valore.

Peccato per chi mantiene il tuo codice successivo.

+3

Inaudito per puro terrore. – Quentin

+0

Si noti che 'args ...' e '__VA_ARGS__' possono differire per casi come' foo (arg1, (extra, parentesi, intorno, virgola, operatore, arg2)); 'o semplice' foo (function_with_side_effect()) '. – Jarod42

+0

@ Jarod42 sì! 'Auto && .... args' e' (__VA_ARGS __) 'sono opzionali e possono causare effetti collaterali imprevedibili. Comunque, ti dà gli argomenti come argomenti, oltre che come token, che immagino sia ciò che l'OP voleva. – Yakk

Problemi correlati