Auswählen einer Mitgliedsfunktion mithilfe von Enable_If-Bedingungen
Die Aufgabe besteht darin, den Aufruf einer Mitgliedsfunktion basierend auf einem Klassenvorlagenparameter zu bestimmen. Das folgende Code-Snippet versucht dies zu erreichen:
#include
#include
template
struct Point
{
void MyFunction(typename std::enable_if<:is_same int>::value, T &>::type* = 0)
{
std::cout ::value, float &>::type* = 0)
{
std::cout Dieser Code kann jedoch nicht kompiliert werden und es kommt der Fehler „kein Typ namens ‚type‘ in ‚struct std::enable_if‘“.
SFINAE in Action
Der Schlüssel zum Verständnis dieses Problems liegt im Konzept von Substitution Failure Is Not An Error (SFINAE). Enable_if ermöglicht die bedingte Kompilierung basierend auf Vorlagenargumenten. In diesem Fall ist das Vorlagenargument T bereits bekannt, wenn die Memberfunktionen instanziiert werden. Daher wird die Bedingung zum Zeitpunkt der Instanziierung ausgewertet und die entsprechende Funktion ausgewählt.
Korrektur des Codes
Um dies zu beheben, müssen wir ein Dummy-Vorlagenargument einführen ist standardmäßig auf T eingestellt. Dadurch kann der SFINAE-Mechanismus wie vorgesehen funktionieren. Der geänderte Code würde so aussehen:
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
std::cout Verhindern der expliziten Spezialisierung von Mitgliedsfunktionen
Wie von HostileFork hervorgehoben, ermöglicht der Originalcode die explizite Angabe von Vorlagenargumenten für die Mitgliedsfunktionen, was zu Folgendem führen könnte: falsche Ergebnisse. Um dies zu verhindern, können wir ein static_assert hinzufügen, das prüft, ob Vorlagenargumente bereitgestellt werden. Dadurch wird sichergestellt, dass immer die richtige Memberfunktion basierend auf dem Vorlagenargument T aufgerufen wird. Der geänderte Code wäre:
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3