Maison > développement back-end > C++ > 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 » ?

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 » ?

Susan Sarandon
Libérer: 2024-11-13 06:09:02
original
375 Les gens l'ont consulté

How can I ensure correct return type deduction with a variadic template function using trailing return type and `decltype`?

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

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

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... > {};
Copier après la connexion

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

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal