Heim  >  Artikel  >  Backend-Entwicklung  >  Warum schlägt std::is_same fehl, wenn versucht wird, verschiedene Containertypen in einer Funktion zu verarbeiten?

Warum schlägt std::is_same fehl, wenn versucht wird, verschiedene Containertypen in einer Funktion zu verarbeiten?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-01 14:09:02171Durchsuche

Why does std::is_same fail when trying to process different container types in a function?

Verwendung von std::is_same: Warum die Funktion verschiedene Containertypen nicht verarbeiten kann

Um eine vielseitige Funktion zu erstellen, die sowohl Stapel als auch Warteschlangen drucken kann, a Der Entwickler stellt einen Kompilierungsfehler fest. Trotz der Verwendung von std::is_same zur Erkennung des Containertyps bleibt die Funktion nicht funktionsfähig.

Der Fehler rührt von der Tatsache her, dass beide Zweige der if-else-Anweisung erfolgreich kompiliert werden müssen, was in diesem Fall verletzt wird . Um dieses Problem zu beheben, wird eine Änderung mithilfe der partiellen Spezialisierung und der element_accessor-Vorlagenstruktur implementiert:

<code class="cpp">template <typename Cont>
struct element_accessor;

template <typename T>
struct element_accessor<std::stack<T>> {
   const T&amp; operator()(const std::stack<T>&amp; s) const { return s.top(); }
};

template <typename T>
struct element_accessor<std::queue<T>> {
   const T&amp; operator()(const std::queue<T>&amp; q) const { return q.front(); }
};

template<typename Cont>
void print_container(Cont&amp; cont){
   while(!cont.empty()){
      auto elem = element_accessor<Cont>{}(cont);
      std::cout << elem << '\n';
      cont.pop();
   }
}

Alternativ kann der Fehler für C 17 und höher mithilfe von if constexpr anstelle der partiellen Spezialisierung umgangen werden:

<code class="cpp">template<template<class> typename Cont, typename T>
void print_container(Cont<T>&amp; cont){
   while(!cont.empty()){
      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();
   }
}</code>

Das obige ist der detaillierte Inhalt vonWarum schlägt std::is_same fehl, wenn versucht wird, verschiedene Containertypen in einer Funktion zu verarbeiten?. 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