Votre intention est de créer une fonction générique, print_container, qui peut imprimer les éléments de les conteneurs de pile et de file d'attente. Cependant, malgré l'utilisation de std::is_same pour vérifier le type de conteneur, votre fonction rencontre des erreurs.
Cause des erreurs :
Les erreurs surviennent car les deux branches du if -else, l'instruction doit être compilable. Dans votre cas, lorsque Cont est std::stack, on accède à la fonction membre front, qui n'existe pas dans std::stack. De même, lorsque Cont est std::queue, la fonction membre supérieure est accessible, qui n'existe pas dans std::queue.
Solution de spécialisation partielle :
Une solution possible consiste à utiliser une spécialisation partielle pour gérer chaque type de conteneur séparément :
<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();
}
}
Cette approche délègue la récupération des éléments à des fonctions spécialisées element_accessor, qui fournissent l'accesseur correct pour chaque type de conteneur.
C 17 Solution avec if constexpr :
Si vous utilisez C 17 ou une version ultérieure, vous pouvez également exploiter la construction if constexpr :
<br>template<template< ;classe> typename Cont, typename 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();
}
}
Cette solution utilise if constexpr pour exécuter conditionnellement le code approprié en fonction du type de conteneur, évitant ainsi le besoin d'une spécialisation partielle.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!