


Comment puis-je garantir une déduction correcte du type de retour avec une fonction de modèle variadique utilisant le type de retour final et « decltype » ?
Nov 13, 2024 am 06:09 AMType de retour de fin utilisant decltype avec une fonction de modèle variadique
En essayant d'implémenter une fonction d'additionneur de base qui accumule les arguments et renvoie une somme avec un type approprié, un utilisateur a rencontré des problèmes avec l'incapacité du compilateur à déduire le type de retour correctement.
Extrait de code :
template <class T, class P...> auto sum(const T&amp; t, const P&amp;... p) -> decltype(t + sum(p...)) { return t + sum(p...); }
Avec le code ci-dessus, le compilateur a du mal à résoudre le type de retour lorsque plus de deux arguments sont impliqués. Pour résoudre ce problème, l'utilisateur a modifié la déclaration de la fonction :
template <class T, class P...> T sum(const T&amp; t, const P&amp;... p);
Cette modification a résolu le problème mais a introduit un autre problème : la fonction a renvoyé un entier pour les arguments de type mixte, ce qui n'était pas souhaité.
Discussion et résolution :
Le problème survient car le type de retour final utilisant decltype n'est considéré comme déclaré qu'une fois que le type de retour est précisé. Cependant, dans ce cas, le type de retour dépend de l'appel récursif à sum.
Pour résoudre ce problème, une classe de traits personnalisés est introduite :
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&amp;>() + val<const U&amp;>() ), P... > {};
En remplaçant decltype par typename sum_type< T,P...>::type, le problème est résolu. Alternativement, l'utilisateur peut modifier la dernière spécialisation de la classe sum_type pour garantir la bonne association des opérateurs :
template<class T, class U, class... P> struct sum_type<T,U,P...> : id<decltype( val<T>() + val<typename sum_type<U,P...>::type>() )>{};
Avec ces modifications, la fonction additionneur accumule avec précision les arguments et renvoie la somme attendue avec le type correct.
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!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

C Fonction Langue Format de lettre ÉTAPES DE CONVERSION DE CAS

Quels sont les types de valeurs renvoyées par les fonctions du langage C? Qu'est-ce qui détermine la valeur de retour?

Gulc: Cibliothèque C construite à partir de zéro

Quelles sont les définitions et les règles d'appel des fonctions du langage C et quelles sont les

Comment fonctionne la bibliothèque de modèle standard C (STL)?

Utilisation distincte et partage de phrases

Où est la valeur de retour de la fonction de langue C stockée en mémoire?

Comment utiliser efficacement les algorithmes du STL (trier, trouver, transformer, etc.)?
