Trailing Return Type Using decltype with a Variadic Template Function
Beim Versuch, eine Funktion zu erstellen, die die Summe ihrer Argumente mithilfe einer Variadic akkumuliert Bei der Syntax von Vorlagen und nachgestellten Rückgabetypen treten Herausforderungen auf. Insbesondere kann es beim Compiler zu Fehlern bei Funktionen mit mehr als zwei Argumenten kommen. Dies liegt daran, dass die variadic-Funktionsvorlage erst nach Angabe ihres Rückgabetyps als deklariert gilt, was dazu führt, dass sum in decltype nicht auf die variadic-Funktionsvorlage selbst verweisen kann.
Eine mögliche Problemumgehung besteht darin, eine benutzerdefinierte Traits-Klasse zu verwenden Vermeiden Sie den rekursiven Aufruf innerhalb des decltype-Ausdrucks:
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... > {};
Dies ermöglicht das Ersetzen von decltype im Originalprogramm durch den Typnamen sum_type
Um sicherzustellen, dass die Summierung die Reihenfolge der Operationen berücksichtigt (z. B. a (b c)), kann die endgültige Spezialisierung von sum_type wie folgt geändert werden:
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 einer Variadic-Vorlagenfunktion, um die Summe ihrer Argumente zu berechnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!