Heim >Backend-Entwicklung >C++ >Wie ruft man in C eine Funktion für verschiedene Vorlagenargumente auf?

Wie ruft man in C eine Funktion für verschiedene Vorlagenargumente auf?

DDD
DDDOriginal
2024-11-10 22:02:03167Durchsuche

How do you call a function on a variadic template arguments in C  ?

Aufrufen einer Funktion für variadische Vorlagenargumente

In C möchte man möglicherweise eine Funktion entwerfen, die nahtlos mit einer beliebigen Anzahl von Argumenten arbeiten kann Argumente verschiedener Art. Die rekursive Vorlagenspezialisierung ermöglicht zwar eine solche Funktionalität, erzeugt jedoch eine beträchtliche Menge an redundantem Code. Um dieses Problem anzugehen, wird nach einem effizienteren Ansatz gesucht.

C 17 Fold Expression Solution

In C 17 wird eine einfache Lösung durch den Fold Expression bereitgestellt:

(f(args), ...);

Dieser Ausdruck ermöglicht den sequentiellen Aufruf von f für jedes Argument im args variadic Pack. Wenn f jedoch ein Objekt mit einem überladenen Kommaoperator zurückgibt, sollte die folgende Syntax verwendet werden:

((void)f(args), ...);

Lösung vor C 17

Vor C 17 , ein typischer Ansatz bestand darin, einen Listeninitialisierer mit einem absichtlich nicht leeren Rückgabetyp zu verwenden:

{ print(Args)... }

Dies erfordert jedoch einen Wrapping der Ausdruck in einer nicht verwendeten Variablen, um Kompilierungsfehler aufgrund des void-Rückgabetyps des Drucks zu verhindern:

using expand_type = int[];
expand_type{ (print(Args), 0)... };

Um die Wiederverwendbarkeit dieses Musters zu verbessern, kann ein Makro definiert werden:

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }

SO_EXPAND_SIDE_EFFECTS(print(Args));

Um die potenzielle Zuweisung großer Arrays zu verringern, kann eine benutzerdefinierte Struktur verwendet werden:

namespace so {
    struct expand_type {
        template <typename... T>
        expand_type(T&amp;&amp;...) {}
    };
}

Das obige ist der detaillierte Inhalt vonWie ruft man in C eine Funktion für verschiedene Vorlagenargumente auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn