Heim > Artikel > Backend-Entwicklung > Warum schlägt std::is_same fehl, wenn versucht wird, verschiedene Containertypen in einer Funktion zu verarbeiten?
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& operator()(const std::stack<T>& s) const { return s.top(); } }; template <typename T> struct element_accessor<std::queue<T>> { const T& operator()(const std::queue<T>& q) const { return q.front(); } }; template<typename Cont> void print_container(Cont& 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>& 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!