Heim >Backend-Entwicklung >C++ >Wie wähle ich Mitgliedsfunktionen basierend auf Klassenvorlagenparametern mithilfe von enable_if in C aus?

Wie wähle ich Mitgliedsfunktionen basierend auf Klassenvorlagenparametern mithilfe von enable_if in C aus?

DDD
DDDOriginal
2024-10-26 05:50:30211Durchsuche

How to Select Member Functions Based on Class Template Parameters Using enable_if in C  ?

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!

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