Wenn variadische Makros Sie __VA_ARGS__
müssen alle Argumente 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 auch __VA_ARGS__
in anderen Kontexten verwenden, wo eine kommagetrennte Liste sinnvoll ist.
Der Trick, den Sie verwenden können, ist Ihre eigene Komma-Operator für std::ostream
(die Art der std::cout
) zu definieren. Zum Beispiel:
#include<iostream>
#define LOG(...) std::cout , __VA_ARGS__ , std::endl
template <typename T>
std::ostream& operator,(std::ostream& out, const T& t) {
out << t;
return out;
}
//overloaded version to handle all those special std::endl and others...
std::ostream& operator,(std::ostream& out, std::ostream&(*f)(std::ostream&)) {
out << f;
return out;
}
int main() {
LOG("example","output","filler","text");
return 0;
}
Nun wird die LOG Aufruf erweitern:
std::cout , "example" , "output" , "filler" , "text" , std::endl;
und die Kommas werden die überladene Komma Operatoren aufrufen.
Wenn Sie nicht überladen operator,
alle std::ostream
-s verschmutzen möchten, können Sie std::cout
mit Ihrer eigenen speziellen Logger-Klasse verkapseln.
Warum? Warum? Warum? schreibe einfach den Code –