Dans le but de créer une fonction polyvalente capable d'imprimer à la fois des piles et des files d'attente, un le développeur rencontre une erreur de compilation. Malgré l'utilisation de std::is_same pour discerner le type du conteneur, la fonction reste non fonctionnelle.
L'erreur provient du fait que les deux branches de l'instruction if-else doivent être compilées avec succès, ce qui est violé dans ce cas. . Pour résoudre ce problème, une modification est implémentée à l'aide de la spécialisation partielle et de la structure du modèle element_accessor :
<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(); } }
Alternativement, pour C 17 et versions ultérieures, l'erreur peut être contournée en utilisant if constexpr plutôt que la spécialisation partielle :
<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>
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!