Wie würde ich ein Makro erstellen, das eine variable Anzahl von Argumenten benötigt und es mit std :: cout ausgibt? Tut mir leid, wenn dies eine Frage ist, konnte nichts finden, was variadic Makros geklärt nach der Suche nach der Antwort.
Konzeptionelles Beispiel:
%Vor%würde ausgeben:
%Vor%Sie benötigen dazu keine Präprozessor-Makros. Du kannst es ganz normal schreiben C ++. In C ++ 11/14:
%Vor%In C ++ 17:
%Vor%ist alles was es braucht. Live-Demo
Ausgabe:
%Vor%Forschung variadische Vorlagen , Parameterpakete und Falten Ausdrücke eher als variadic Makros, die in modernen C ++ selten nützlich sind.
Wenn variadic Makros verwendet werden, benötigen Sie __VA_ARGS__
, um alle Argumente zu erweitern.
Das Problem ist jedoch, dass diese Argumente durch Kommas getrennt sind. Vermutlich trennt es nur Argumente zu einem Funktionsaufruf, aber da Makros nur mit Text arbeiten, können Sie __VA_ARGS__
auch in anderen Kontexten verwenden, wo eine kommagetrennte Liste sinnvoll ist.
Der Trick, den Sie anwenden können, ist, Ihren eigenen Kommaoperator für std::ostream
(den Typ von std::cout
) zu definieren. Zum Beispiel:
Nun wird der LOG-Aufruf zu:
erweitert %Vor%und die Kommas werden die überladenen Kommaoperatoren aufrufen.
Wenn Sie operator,
nicht alle std::ostream
-s überladen möchten, können Sie std::cout
mit Ihrer eigenen speziellen Logger-Klasse einkapseln.
Tags und Links c++ c++11 c-preprocessor