Maison >développement back-end >C++ >Pourquoi ma fonction ne peut-elle pas gérer plusieurs types de conteneurs à l'aide de « std::is_same » ?

Pourquoi ma fonction ne peut-elle pas gérer plusieurs types de conteneurs à l'aide de « std::is_same » ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-01 07:23:30415parcourir

Why Can't My Function Handle Multiple Container Types Using `std::is_same`?

Pourquoi votre fonction ne peut pas gérer plusieurs types de conteneurs à l'aide de std::is_same

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>
<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&lt ;classe> typename Cont, typename T><br>void print_container(Cont<T>& cont){<br> while(!cont.empty()){</p><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!

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