Heim > Artikel > Backend-Entwicklung > Wie kann ich mit einer variadischen Vorlagenfunktion unter Verwendung des nachgestellten Rückgabetyps und „decltype“ die korrekte Ableitung des Rückgabetyps sicherstellen?
Trailing Return Type Using decltype with a Variadic Template Function
Beim Versuch, eine grundlegende Additionsfunktion zu implementieren, die die Argumente akkumuliert und eine Summe zurückgibt Bei einem geeigneten Typ stieß ein Benutzer auf Probleme mit der Unfähigkeit des Compilers, den Rückgabetyp korrekt abzuleiten.
Code-Snippet:
template <class T, class P...> auto sum(const T& t, const P&... p) -> decltype(t + sum(p...)) { return t + sum(p...); }
Mit dem obigen Code wird der Der Compiler hat Schwierigkeiten, den Rückgabetyp aufzulösen, wenn mehr als zwei Argumente beteiligt sind. Um dieses Problem zu beheben, hat der Benutzer die Funktionsdeklaration geändert:
template <class T, class P...> T sum(const T& t, const P&... p);
Diese Änderung hat das Problem behoben, aber ein weiteres Problem eingeführt: Die Funktion hat eine Ganzzahl für gemischte Argumente zurückgegeben, was nicht erwünscht war.
Diskussion und Lösung:
Das Problem entsteht, weil der nachfolgende Rückgabetyp, der decltype verwendet, erst als deklariert gilt, nachdem der Rückgabetyp angegeben wurde. In diesem Fall hängt der Rückgabetyp jedoch vom rekursiven Aufruf von sum ab.
Um dieses Problem zu beheben, wird eine benutzerdefinierte Merkmalsklasse eingeführt:
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... > {};
Durch Ersetzen von decltype durch den Typnamen sum_type< T,P...>::type, das Problem ist behoben. Alternativ könnte der Benutzer die letzte Spezialisierung der sum_type-Klasse ändern, um die korrekte Zuordnung der Operatoren sicherzustellen:
template<class T, class U, class... P> struct sum_type<T,U,P...> : id<decltype( val<T>() + val<typename sum_type<U,P...>::type>() )>{};
Mit diesen Änderungen akkumuliert die Addiererfunktion Argumente genau und gibt die erwartete Summe mit dem richtigen Typ zurück.
Das obige ist der detaillierte Inhalt vonWie kann ich mit einer variadischen Vorlagenfunktion unter Verwendung des nachgestellten Rückgabetyps und „decltype“ die korrekte Ableitung des Rückgabetyps sicherstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!