Heim >Backend-Entwicklung >C++ >Wie 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?

Wie 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?

DDD
DDDOriginal
2024-11-15 02:26:02415Durchsuche

How can trailing return types be used with variadic template functions to deduce the correct return type for a function that sums arguments of varying types?

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::Eingabe des abschließenden Rückgabetyps, die Funktion leitet den Ergebnistyp für eine beliebige Anzahl korrekt ab Argumente:

template <class T, class... P>
auto sum(const T& t, const P&amp;... 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!

Stellungnahme:
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