Nachfolgender Rückgabetyp unter Verwendung von Dectype mit einer variadischen Vorlagenfunktion
Beim Versuch, eine Variationsvorlagenfunktion zu erstellen, die Argumente unterschiedlicher Typen summiert und zurückgibt Bei einer entsprechend eingegebenen Summe treten häufige Probleme auf.
Problem Formulierung
Eine grundlegende Implementierung, die decltype als abschließenden Rückgabetyp verwendet, führt zu undefiniertem Verhalten für Argumente über zwei. Um dies zu vermeiden, kann die Funktion explizit deklariert werden. Dies führt jedoch zu einer falschen Typableitung für mehrere Argumente.
Lösung mithilfe der benutzerdefinierten Traits-Klasse
Um diese Probleme zu überwinden, Es wird eine benutzerdefinierte Merkmalsklasse namens sum_type verwendet. Es berechnet rekursiv den Rückgabetyp mithilfe von std::add_rvalue_reference und std::val.
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... > {};
Geänderte Implementierung
Durch Ersetzen von decltype durch den Typnamen sum_type
template <class T, class... P> auto sum(const T& t, const P&... p) -> typename sum_type<T,P...>::type { return t + sum(p...); }
Verbesserte Typableitung
Zusätzlich sorgt eine Änderung an der letzten Spezialisierung von sum_type für eine verbesserte Typableitung:
template<class T, class U, class... P> struct sum_type<T,U,P...> : id<decltype( val<T>() + val<typename sum_type<U,P...>::type>() )>{};
Dadurch wird sichergestellt, dass der Rückgabetyp mit decltype(a (b c)) übereinstimmt und mit der erwarteten Additionsreihenfolge übereinstimmt.
Das obige ist der detaillierte Inhalt vonWie können nachfolgende Rückgabetypen mit variadischen Vorlagenfunktionen verwendet werden, um den richtigen Rückgabetyp für eine Funktion abzuleiten, die Argumente unterschiedlicher Typen summiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!