Auswählen einer Mitgliedsfunktion mithilfe verschiedener enable_if-Bedingungen
In C kann die Metafunktion enable_if verwendet werden, um Code basierend auf der Kompilierung selektiv zu aktivieren oder zu deaktivieren -Zeitbedingungen. Diese Technik wird häufig verwendet, um Überladungen von Mitgliedsfunktionen bereitzustellen, die unterschiedliche Arten von Argumenten verarbeiten oder je nach Vorlagenparametern unterschiedliche Aktionen ausführen.
Beim Versuch, „enable_if“ zu verwenden, um zwischen Mitgliedsfunktionen basierend auf Klassenvorlagenparametern zu wählen, ist dies wichtig um zu verstehen, dass „enable_if“ dadurch funktioniert, dass Ersetzungen von Vorlagenargumenten, die zu Fehlern führen, aus dem Überlastungsauflösungssatz entfernt werden.
Problem:
Im bereitgestellten Code wird die enable_if-Bedingungen werden direkt auf die Mitgliedsfunktionen angewendet, dieser Ansatz erzielt jedoch nicht den gewünschten Effekt, da das Vorlagenargument T beim Instanziieren dieser Funktionen bereits bekannt ist.
<code class="cpp">template<typename T> struct Point { void MyFunction(typename std::enable_if<std::is_same<T, int>::value, T &>::type* = 0) { std::cout << "T is int." << std::endl; } void MyFunction(typename std::enable_if<!std::is_same<T, int>::value, float &>::type* = 0) { std::cout << "T is not int." << std::endl; } };</code>
Lösung:
Um dieses Problem zu beheben, erstellen Sie ein Dummy-Vorlagenargument, das standardmäßig T ist, und verwenden Sie dieses, um SFINAE-Prüfungen (Substitution Failure Is Not An Error) durchzuführen. Dieser Ansatz ermöglicht es dem Compiler, basierend auf dem Typ des Dummy-Arguments zu bestimmen, welche Mitgliedsfunktion aufgerufen werden soll.
<code class="cpp">template<typename T> struct Point { template<typename U = T> typename std::enable_if<std::is_same<U, int>::value>::type MyFunction() { std::cout << "T is int." << std::endl; } template<typename U = T> typename std::enable_if<std::is_same<U, float>::value>::type MyFunction() { std::cout << "T is not int." << std::endl; } };</code>
Verhindern der Spezialisierung expliziter Vorlagenargumente:
Wie erwähnt Durch HostileFork ist es für Benutzer möglich, explizit Vorlagenargumente für Mitgliedsfunktionen anzugeben, was zu falschen Ergebnissen führen könnte. Um dies zu verhindern, überprüfen Sie mit static_assert, ob keine expliziten Argumente bereitgestellt werden:
<code class="cpp">template<typename T> struct Point { template<typename... Dummy, typename U = T> typename std::enable_if<std::is_same<U, int>::value>::type MyFunction() { static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!"); std::cout << "T is int." << std::endl; } template<typename... Dummy, typename U = T> typename std::enable_if<std::is_same<U, float>::value>::type MyFunction() { static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!"); std::cout << "T is not int." << std::endl; } };</code>
Das obige ist der detaillierte Inhalt vonWie wähle ich Mitgliedsfunktionen basierend auf Klassenvorlagenparametern mithilfe von enable_if in C aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!