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
Libérer: 2024-11-01 07:23:30
original
414 Les gens l'ont consulté

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

}
}

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

}
}

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!

source:php.cn
Article précédent:Comment puis-je gérer les caractères baltes et exécuter des commandes CMD avec eux dans les projets Visual Studio 2019 C ? Article suivant:La mémoire perdue est-elle libérée à la fin d'un programme ?
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
Derniers numéros
Rubriques connexes
Plus>
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal