Heim  >  Artikel  >  Backend-Entwicklung  >  Warum schlägt meine generische Funktion für Druckstapel und Warteschlangen fehl und wie kann ich das Problem beheben?

Warum schlägt meine generische Funktion für Druckstapel und Warteschlangen fehl und wie kann ich das Problem beheben?

DDD
DDDOriginal
2024-11-01 22:17:021020Durchsuche

Why Does My Generic Function for Print Stacks and Queues Fail, and How Can I Fix It?

Warum die Funktion fehlschlägt und wie das Problem gelöst wird

Der bereitgestellte Code versucht, eine generische Funktion zu erstellen, die sowohl Stapel als auch Warteschlangen drucken kann . Dies scheitert jedoch an einem grundlegenden Problem: Beide Zweige der if-else-Anweisung müssen kompilierbar sein. In diesem Fall ist dies nicht der Fall.

Der Fehler tritt insbesondere auf, weil die Member-Funktion top() nur für Stacks verfügbar ist, während die Member-Funktion front() nur für Warteschlangen verfügbar ist. Der Compiler meldet das Problem, wenn er versucht, beide Zweige für denselben Containertyp zu kompilieren, da er nicht bestimmen kann, welche Mitgliedsfunktion verwendet werden soll.

Eine Lösung für dieses Problem ist die Verwendung einer teilweisen Spezialisierung. Durch die teilweise Spezialisierung können Sie verschiedene Implementierungen einer Vorlage für bestimmte Typen oder Klassen definieren. In diesem Fall können Sie Teilspezialisierungen für Stapel und Warteschlangen definieren und so sicherstellen, dass jede Implementierung über die entsprechende Mitgliedsfunktion verfügt:

<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();
    }
}

Diese Lösung verwendet eine Klasse element_accessor, um auf die entsprechende Mitgliedsfunktion für jeden Containertyp zuzugreifen. Durch die Bereitstellung teilweiser Spezialisierungen für Stapel und Warteschlangen stellen Sie sicher, dass für jeden Fall der richtige Code kompiliert wird.

Eine weitere Lösung, die in C 17 und höher verfügbar ist, ist die Verwendung von if constexpr:

<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>

Diese Lösung verwendet constexpr-Bedingungsausdrücke, um den richtigen Code basierend auf dem Containertyp auszuwählen. Indem Sie den Cont-Typ zur Kompilierungszeit überprüfen, können Sie sicherstellen, dass für jeden Container die richtige Memberfunktion aufgerufen wird.

Das obige ist der detaillierte Inhalt vonWarum schlägt meine generische Funktion für Druckstapel und Warteschlangen fehl und wie kann ich das Problem beheben?. 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