Ihre Absicht ist es, eine generische Funktion, print_container, zu erstellen, die die Elemente von drucken kann sowohl Stapel- als auch Warteschlangencontainer. Trotz der Verwendung von std::is_same zur Überprüfung des Containertyps stößt Ihre Funktion jedoch auf Fehler.
Fehlerursache:
Die Fehler entstehen, weil beide Zweige des if -else-Anweisung muss kompilierbar sein. Wenn in Ihrem Fall Cont std::stack ist, wird auf die Front-Member-Funktion zugegriffen, die in std::stack nicht vorhanden ist. Wenn Cont gleich std::queue ist, wird auf die Top-Member-Funktion zugegriffen, die in std::queue nicht vorhanden ist.
Teilspezialisierungslösung:
Eine mögliche Lösung besteht darin, eine teilweise Spezialisierung zu verwenden, um jeden Containertyp separat zu behandeln:
<br>template <typename Cont><br>struct element_accessor;</p> <p>template <typename T><br>struct element_accessor<std::stack<T>> {<br> const T& Operator()(const std::stack<T>& s) const { return s.top(); }<br>};</p> <p>template <typename T><br>struct element_accessor<std::queue<T>> {<br> const T& Operator()(const std::queue<T>& q) const { return q.front(); }<br>};</p> <p>template<typename Cont><br>void print_container(Cont& cont){<br> while(!cont.empty()){</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> auto elem = element_accessor<Cont>{}(cont); std::cout << elem << '\n'; cont.pop();
}
}
Dieser Ansatz delegiert den Abruf von Elementen an spezielle element_accessor-Funktionen, die für jeden Containertyp den richtigen Accessor bereitstellen.
C 17 Lösung mit if constexpr:
Wenn Sie C 17 oder höher verwenden, können Sie auch das if constexpr-Konstrukt nutzen:
<br>template<template< ;Klasse> Typname Cont, Typname T><br>void print_container(Cont<T>& cont){<br> while(!cont.empty()){</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> if constexpr (std::is_same_v<Cont<T>, std::stack<T>>) std::cout << cont.top() << '\n'; else if constexpr (std::is_same_v<Cont<T>, std::queue<T>>) std::cout << cont.front() << '\n'; cont.pop();
}
}
Diese Lösung verwendet if constexpr, um den entsprechenden Code basierend auf dem Containertyp bedingt auszuführen, wodurch die Notwendigkeit einer teilweisen Spezialisierung vermieden wird.
Das obige ist der detaillierte Inhalt vonWarum kann meine Funktion nicht mehrere Containertypen mit „std::is_same' verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!