In C 20 wird die Erfassung von Kontextdetails für Funktionsaufrufe mit std::source_location ermöglicht. Allerdings hat sich die Verwendung mit variadischen Vorlagenfunktionen aufgrund der Positionierung des Parameters „source_location“ als schwierig erwiesen.
Das Positionsproblem
Variadische Parameter befinden sich ausnahmslos am Ende des Parameterliste. Dies behinderte die Verwendung von std::source_location aus folgenden Gründen:
Erster Versuch:
<code class="cpp">template <typename... Args> void debug(Args&&... args, const std::source_location& loc = std::source_location::current());</code>
fehlschlägt, weil variadische Parameter erforderlich sind am Ende wohnen.
Zweitens Versuch:
<code class="cpp">template <typename... Args> void debug(const std::source_location& loc = std::source_location::current(), Args&&... args);</code>
führt zu Mehrdeutigkeit für Anrufer, da ein unerwarteter Parameter eingefügt wird.
Lösung: Deduktionsleitfäden nutzen
Die ursprüngliche Form kann durch die Einführung eines Abzugs wiederbelebt werden Anleitung:
<code class="cpp">template <typename... Ts> struct debug { debug(Ts&&... ts, const std::source_location& loc = std::source_location::current()); }; template <typename... Ts> debug(Ts&&...) -> debug<Ts...>;</code>
Dies ermöglicht Aufrufe wie:
<code class="cpp">int main() { debug(5, 'A', 3.14f, "foo"); }</code>
Fazit:
Durch die Verwendung von Ableitungsanleitungen können C-Programmierer dies nahtlos tun Integrieren Sie std::source_location in verschiedene Vorlagenfunktionen, um Kontextinformationen zu Funktionsaufrufen mühelos zu erfassen.
Das obige ist der detaillierte Inhalt vonWie verwende ich „std::source_location' mit Variadic-Vorlagenfunktionen in C 20?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!