Ü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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage