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
Antwort
Was Sie fragen, ist unmöglich.
Die Argumente einer Variadic-Funktion werden zur Laufzeit festgelegt, aber ein Makro wird zur Kompilierzeit erweitert.
Unmöglich? Das ist C++. – Yakk
@Yakk Es ist __is__ unmöglich. Lesen Sie seine Frage erneut. 'foo' muss eine Funktion sein, kein Makro. – orlp
"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
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.
Vor lauter Angst umgestimmt. – Quentin
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
@ 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
- 1. Variadische Makro erwartet ‚)‘ vor numerische Konstante
- 2. Variadische Funktion mit Schlüsselwort-Argumente
- 3. Aliasing eine variadische Template-Funktion
- 4. P/Aufruf eine Funktion mit einer variadische Unterschrift
- 5. Variadische Erweiterung der Verwendung Deklaration
- 6. Java variadische Funktionsparameter
- 7. Mehrfachvererbung und variadische Vorlagen
- 8. Go: Variadische Funktion und zu viele Argumente?
- 9. Wie man eine variadische Funktion definieren
- 10. Variadische Funktion (va_arg) funktioniert nicht mit float?
- 11. Zwei variadische Vorlagen für eine einzelne Funktion?
- 12. Variadische Expander ohne typedef
- 13. Generisches variadische Parameter
- 14. Variadische Vorlage Konstruktor Priorität
- 15. rekursive variadische Funktionsvorlage
- 16. Variadische Aggregate als Kernsprachmerkmal
- 17. Variadische Methode in Swift
- 18. Sequenzierung unter einer variadische Expansion
- 19. Variadische Vorlagen und C-Arrays
- 20. Variadische Makros mit null Argumente und Komma
- 21. Variadische Vorlagen in Scala emulieren
- 22. C++ Variadische Funktionsschablonen bekannter Art
- 23. Variadische Vorlagen mit 'const' Parameter
- 24. Variadische Funktion in Objective C, die der rechten Primitiven
- 25. Wie die Art der übergebenen Argumente zu variadische Funktion
- 26. Ursache Variadische Argumente korrumpiert/null
- 27. Variadische Vorlagen für Lambda-Ausdrücke
- 28. Typenkonflikt in variadische Vorlage Vererbung
- 29. Variadische Vorlagen und keine Werte
- 30. variadische Funktionsvorlage ohne formale Parameter
Können Sie variadic Vorlage für 'foo' anstelle von Ellipsen verwenden? – Jarod42
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
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. –