Maison  >  Article  >  développement back-end  >  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
Mary-Kate Olsenoriginal
2024-11-01 14:09:02171parcourir

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

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>

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