Maison > développement back-end > C++ > Pourquoi std::is_same échoue-t-il lorsque vous essayez de traiter différents types de conteneurs dans une fonction ?

Pourquoi std::is_same échoue-t-il lorsque vous essayez de traiter différents types de conteneurs dans une fonction ?

Mary-Kate Olsen
Libérer: 2024-11-01 14:09:02
original
299 Les gens l'ont consulté

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

Utilisation de std::is_same : pourquoi la fonction ne parvient pas à traiter différents types de conteneurs

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&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();
   }
}
Copier après la connexion

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>&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>
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal