Wie kann eine Sprintf-ähnliche Funktion in C ++ 20/23 überprüfen, ob die Anzahl der Formatspezifizierer mit der Anzahl dC++

Programme in C++. Entwicklerforum
Anonymous
 Wie kann eine Sprintf-ähnliche Funktion in C ++ 20/23 überprüfen, ob die Anzahl der Formatspezifizierer mit der Anzahl d

Post by Anonymous »

Ich versuche, C ++ 23 zu lernen, und dachte Die Anzahl der Argumente entspricht der Anzahl der Platzhalter (hier nur "%" für den Einfachheit halber) in der Formatzeichenfolge und erstellt und gibt dann die formatierte Zeichenfolge zurück. Wenn ich eine String-Formatierung ignoriere, kann ich die Anzahl der Argumente und Platzhalter nicht zum Arbeiten erstellen. count_percents () auf dem String-Literal zur Kompilierungszeit, ich denke, weil meine Verwendung von std :: to_string () in Sprintf () kein konstanter Ausdruck ist (unter Verwendung von GCC-Trunk-std = c ++ 2b). Wenn ich den Anruf nach std :: to_string () entferne, kann ich beide Funktionen konstruieren und die gewünschte Kompilierungszeitprüfung abrufen, aber dann ist die Fähigkeit, in Sprintf () viel anderes zu tun, stark eingeschränkt (zum Beispiel kann ich nicht nicht Verwenden Sie std :: to_string () oder erstellen/manipulieren und dann eine std :: string zurückgeben. Variadisches Makro, das zunächst die Anzahl der Argumente mit einem direkten Aufruf einer consteval count_percents () überprüft, bevor sie dann eine (nicht konstvale) Helferfunktion aufrufen fühlt sich an, als müsste es einen besseren, makrofreien Weg in C ++ 23 geben. < /p>
#include

template
constexpr size_t count_percents(const char (&s)[N]) {
size_t count = 0;
for (size_t i = 0; i < N; i++)
if (s == '%') ++count;
return count;
}

template
constexpr std::string Sprintf(const char (&format)[N], Args&&... args) {
if (count_percents(format) != sizeof...(args))
throw std::invalid_argument("wrong number of placeholders in format string");

return (std::to_string(args) + ...);
}

int main() {
std::cout

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post