Übergabe variadischer Vorlagenargumente an eine variadische Funktion
Wir verwenden eine C-Bibliothek eines Drittanbieters, die aprintf()
Protokollfunktion,
void log(const char *format, ...);
Aus Gründen, die es nicht wert sind, angesprochen zu werden, müssen wir die Geschwindigkeit begrenzen, mit der Nachrichten protokolliert werden
void rate_limited_log(const char* format, ...)
{
if (<not too fast>) {
log(format, ...);
}
}
Glücklicherweise wussten die Autoren der C-Bibliothek, was sie taten, und stellten zur Verfügung
void logv(const char* format, va_list ap);
Das Schreiben der obigen Funktion ist daher relativ einfach. Leider aberVariadische Funktionen spielen mit Inlining keine gute RolleUnd so kam ich auf eine zweite Lösung:
template <typename... T>
void rate_limited_log(const char* format, T&&... args)
{
if (<not too fast>) {
log(format, std::forward<T>(args)...);
}
}
Dies funktioniert perfekt und unterstreicht die von uns gewünschte Geschwindigkeitsbegrenzungsbedingung. Aber ich habe ein paar Fragen dazu:
Ist das Erweitern eines Parameterpakets zu einem variablen Funktionsaufruf im C-Stil wie diesem in C ++ 11 eine zulässige, genau definierte Aufgabe, oder haben wir nur das Glück, dass dies funktioniert?
Sind die&&
undstd::forward
eigentlich hier nötig, da wir eine C-Funktion aufrufen? Es scheint genauso gut zu funktionieren, wenn ich es benutzeconst T&
oder auch nurT
nach Wert, mit oder ohnestd::forward
.