Heim > Backend-Entwicklung > C++ > Wie verwende ich „decltype' mit Variadic-Vorlagenfunktionen, um Argumente zu summieren?

Wie verwende ich „decltype' mit Variadic-Vorlagenfunktionen, um Argumente zu summieren?

Mary-Kate Olsen
Freigeben: 2024-11-13 04:48:02
Original
862 Leute haben es durchsucht

How to Use `decltype` with Variadic Template Functions to Sum Arguments?

Verwenden von decltype mit Variadic-Vorlagenfunktionen

Beim Versuch, eine Variadic-Vorlagenfunktion zu schreiben, die mithilfe von decltype eine Summe mit einem geeigneten Typ zurückgibt, ist dies der Fall Es ist möglich, dass einige unerwartete Probleme auftreten.

Die Problem

Zunächst wird eine Funktion ohne abschließenden Rückgabetyp deklariert. Wenn jedoch mehrere Argumente übergeben werden, interpretiert der Compiler die Funktion als undefiniert. Das Deklarieren der Funktion mit einem abschließenden Rückgabetyp löst das Problem für mehr als zwei Argumente, führt jedoch zu falschen Rückgabetypen für Argumente unterschiedlicher Typen.

Das Problem

decltype ist Der Typ von t sum(p...) kann nicht für mehr als zwei Argumente abgeleitet werden, da die variadic-Funktionsvorlage erst nach dem Rückgabetyp deklariert wird angegeben.

Die Problemumgehung

Um diesen rekursiven Aufruf in decltype zu vermeiden, kann eine benutzerdefinierte Traits-Klasse verwendet werden. Die sum_type-Klasse bestimmt den Typ der Summe für mehrere Argumente, ohne dass ein rekursiver Abzug erforderlich ist.

Aktualisierter Code

Ersetzen Sie decltype in Ihrem Programm durch den Typnamen sum_type::type wie gezeigt:

#include <iostream>
#include <type_traits>
using namespace std;

template<class T> typename std::add_rvalue_reference<T>::type val();

template<class T> struct id{typedef T type;};

template<class T, class... P> struct sum_type;
template<class T> struct sum_type<T> : id<T> {};
template<class T, class U, class... P> struct sum_type<T,U,P...>
: sum_type< decltype( val<const T&amp;>() + val<const U&amp;>() ), P... > {};
Nach dem Login kopieren

Diese Methode gibt decltype((a b) c) anstelle von decltype(a (b c)). Um ein genaueres Ergebnis von decltype(a (b c)) zu erhalten, ändern Sie die letzte Spezialisierung wie folgt:

template<class T, class U, class... P> struct sum_type<T,U,P...>
: id<decltype(
      val<T>()
    + val<typename sum_type<U,P...>::type>()
)>{};
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie verwende ich „decltype' mit Variadic-Vorlagenfunktionen, um Argumente zu summieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage