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
#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&>() + val<const U&>() ), P... > {};
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>() )>{};
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!