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
Susan Sarandonoriginal
2024-11-13 06:09:02354parcourir

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...);
}

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!

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