Wie mache ich ein variadisches Makro für std :: cout?

7

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%     
BlurryZombie 29.03.2015, 06:52
quelle

3 Antworten

15

Sie benötigen dazu keine Präprozessor-Makros. Du kannst es ganz normal schreiben C ++. In C ++ 11/14:

%Vor%

Live-Demo

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.

    
Mike Kinghan 29.03.2015 07:40
quelle
7

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:

%Vor%

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.

    
CygnusX1 29.03.2015 07:35
quelle
1

Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, ein variadisches Makro in C ++ zu definieren (zumindest nicht portabel). Warum verwenden Sie keinen variadischen Vorlagenansatz? Etwas wie

%Vor%     
vsoftco 29.03.2015 07:35
quelle

Tags und Links