2015-04-29 20 views
6

Ich habe eine Inline-variadische Funktion
inline int foo(...)
ich foo() brauchen ein Makro aufzurufen (es uns nennen wir MACRO), die auch variadische ist.
Grundsätzlich brauche ich foo(), um alle seine Eingangsparameter zu MACRO zu übergeben. Neudefinieren foo() als ein anderes Makro wäre eine einfache Lösung wegen __VA_ARGS__ Option, aber ich brauche auch foo(), um einen Wert zurückzugeben.
Hinweis: Ich versuche, zwei Teile des bereits geschriebenen Codes zu verbinden, und ich darf sie nicht ändern. foo(...) wird im ersten Teil des Codes verwendet und MACRO ist im zweiten Teil definiert. Einzige Sache, die ich tun soll, ist eine foo() zu definieren, die MACRO verwendet und ich kann nicht, weil sie beide variadic sind.Variadische Aufruf der Funktion ein variadische Makro

+0

Können Sie variadic Vorlage für 'foo' anstelle von Ellipsen verwenden? – Jarod42

+0

Sprechen Sie über Varargs oder Variadic Funktionsvorlagen? Mit einem kann dein Problem gelöst werden, mit dem anderen kann es nicht gelöst werden. – Quentin

+4

Kann nicht gemacht werden. Funktionsparameter werden zur Laufzeit gesetzt, Makros werden vor dem Übersetzen erweitert. Ich würde dieses Chaos wegwerfen und eine vernünftige Art und Weise finden, zu tun, was immer es versucht. –

Antwort

1

Was Sie fragen, ist unmöglich.

Die Argumente einer Variadic-Funktion werden zur Laufzeit festgelegt, aber ein Makro wird zur Kompilierzeit erweitert.

+1

Unmöglich? Das ist C++. – Yakk

+0

@Yakk Es ist __is__ unmöglich. Lesen Sie seine Frage erneut. 'foo' muss eine Funktion sein, kein Makro. – orlp

+0

"Weil' foo' einen Wert zurückgeben muss. " Alles, was wir brauchen, ist ein Makro, das dann einen Wert zurückgibt! Opfere 3 Jungfrauenziegen auf der Marssolitistik und rufe mich am Morgen an. Oder, weißt du, beschwöre Beschimpfungen mit C++ - Code. Entweder funktioniert. – Yakk

6

Machen Sie foo ein Makro, das ein Lambda enthält, das einen Wert zurückgibt, und ruft dann dieses Lambda auf.

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

jetzt int x = foo(a, b, c); werden beide rufen Sie die Lambda innerhalb foo, und innerhalb dieser Lambda rufen Sie das Makro auf (a, b, c) und kann einen Wert zurückgeben.

Ich bedauere, wem auch immer Ihren Code hält.

+3

Vor lauter Angst umgestimmt. – Quentin

+0

Beachten Sie, dass 'args ...' und '__VA_ARGS__' für Fälle wie' foo (arg1, (extra, runde, runde, Komma, operator, arg2)); 'oder einfache' foo (function_with_side_effect()) 'abweichen können. – Jarod42

+0

@ Jarod42 ja! Das 'auto && .... args' und' (__VA_ARGS __) 'ist optional und kann unvorhersehbare Nebenwirkungen verursachen. Dennoch, es gibt Ihnen die Argumente als Argumente, sowie als Token, die ich sehe, was das OP wollte. – Yakk

Verwandte Themen