Utilisation de decltype avec des fonctions de modèle variadique
Lorsque vous essayez d'écrire une fonction de modèle variadique qui renvoie une somme avec un type approprié à l'aide de decltype, elle Il est possible de rencontrer des problèmes inattendus.
Le problème
Initialement, une fonction est déclarée sans type de retour final. Cependant, lorsque plusieurs arguments lui sont transmis, le compilateur interprète la fonction comme non définie. Déclarer la fonction avec un type de retour final résout le problème pour plus de deux arguments mais entraîne des types de retour incorrects pour des arguments de types différents.
Le problème
decltype est impossible de déduire le type de t sum(p...) pour plus de deux arguments car le modèle de fonction variadique n'est déclaré qu'une fois le type de retour spécifié.
La solution de contournement
Pour éviter cet appel récursif dans decltype, une classe de traits personnalisés peut être utilisée. La classe sum_type détermine le type de somme pour plusieurs arguments sans avoir besoin de déduction récursive.
Code mis à jour
Remplacez decltype dans votre programme par le nom de type sum_type
#include <iostream> #include <type_traits> using namespace std; template<class T> typename std::add_rvalue_reference<T>::type val(); template<class T> struct id{typedef T type;}; template<class T, class... P> struct sum_type; template<class T> struct sum_type<T> : id<T> {}; template<class T, class U, class... P> struct sum_type<T,U,P...> : sum_type< decltype( val<const T&>() + val<const U&>() ), P... > {};
Cette méthode renvoie decltype((a b) c) au lieu de decltype(a (bc)). Pour un résultat plus précis de decltype(a (bc)), modifiez la dernière spécialisation comme suit :
template<class T, class U, class... P> struct sum_type<T,U,P...> : id<decltype( val<T>() + val<typename sum_type<U,P...>::type>() )>{};
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!