Heim > Backend-Entwicklung > C++ > Warum kann meine Funktion nicht mehrere Containertypen mit „std::is_same' verarbeiten?

Warum kann meine Funktion nicht mehrere Containertypen mit „std::is_same' verarbeiten?

Linda Hamilton
Freigeben: 2024-11-01 07:23:30
Original
414 Leute haben es durchsucht

Why Can't My Function Handle Multiple Container Types Using `std::is_same`?

Warum Ihre Funktion mit std::is_same nicht mehrere Containertypen verarbeiten kann

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();
Nach dem Login kopieren

}
}

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&lt ;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();
Nach dem Login kopieren

}
}

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!

Quelle:php.cn
Vorheriger Artikel:Wie kann ich in Visual Studio 2019 C-Projekten mit baltischen Zeichen umgehen und CMD-Befehle damit ausführen? Nächster Artikel:Wird verlorener Speicher freigegeben, wenn ein Programm beendet wird?
Erklärung dieser Website
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
Neueste Artikel des Autors
Aktuelle Ausgaben
verwandte Themen
Mehr>
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage