Heim >Backend-Entwicklung >C++ >Wie verwende ich „std::source_location' in Variadic-Vorlagenfunktionen?

Wie verwende ich „std::source_location' in Variadic-Vorlagenfunktionen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-30 19:08:451063Durchsuche

How to Use `std::source_location` in Variadic Template Functions?

Verwendung von std::source_location in Variadic-Vorlagenfunktionen

Bei Nutzung der C 20-Funktion std::source_location zum Erfassen von Kontextinformationen in Variadic-Vorlagen Funktionen stellt es eine Herausforderung dar, zu bestimmen, wo der Parameter „source_location“ platziert werden soll.

Fehlgeschlagene Versuche

Fehlversuche umfassen:

  • Variadic-Parameter am Ende:

    <code class="cpp">template<typename... Args>
    void debug(Args&&... args, const std::source_location& loc = std::source_location::current());</code>

Dies schlägt fehl, da Variadic-Parameter am Ende stehen müssen.

  • Parametereinfügung:

    <code class="cpp">template<typename... Args>
    void debug(const std::source_location& loc = std::source_location::current(),
    Args&&... args);</code>

Dies verwirrt den Aufrufer, was bei der Übergabe regulärer Argumente (z. B. debug(42);) zu einem Fehler führen würde.

Lösung: Abzugsleitfaden

Das Problem kann durch Hinzufügen eines Abzugsleitfadens zum ersten Formular gelöst werden:

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

Dieser Abzugsleitfaden leitet die Vorlagenparameter ab auf den Funktionsargumenten, sodass der Parameter „source_location“ am Ende platziert werden kann.

Test und Demonstration

<code class="cpp">int main()
{
    debug(5, 'A', 3.14f, "foo");
}</code>

Live-Demo: https://godbolt.org /z/n9Wpo9Wrj

Das obige ist der detaillierte Inhalt vonWie verwende ich „std::source_location' in Variadic-Vorlagenfunktionen?. 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