Maison >développement back-end >C++ >Comment les types de retour de fin peuvent-ils être utilisés avec des fonctions de modèle variadiques pour déduire le type de retour correct pour une fonction qui additionne des arguments de différents types ?

Comment les types de retour de fin peuvent-ils être utilisés avec des fonctions de modèle variadiques pour déduire le type de retour correct pour une fonction qui additionne des arguments de différents types ?

DDD
DDDoriginal
2024-11-15 02:26:02415parcourir

How can trailing return types be used with variadic template functions to deduce the correct return type for a function that sums arguments of varying types?

Type de retour de fin utilisant Dectype avec une fonction de modèle variadique

Lors de la tentative de création d'une fonction de modèle variationnelle qui additionne des arguments de différents types et renvoie une somme correctement typée, des problèmes courants surviennent.

Formulation du problème

Une implémentation de base utilisant decltype comme type de retour final entraîne un comportement indéfini pour les arguments dépassant deux. Pour éviter cela, la fonction peut être déclarée explicitement, mais cela conduit à une déduction de type incorrecte pour plusieurs arguments.

Solution utilisant la classe de traits personnalisés

Pour surmonter ces problèmes, une classe de traits personnalisés appelée sum_type est utilisée. Il calcule de manière récursive le type de retour en utilisant std::add_rvalue_reference et std::val.

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

Implémentation modifiée

En remplaçant decltype par typename sum_type::tapez le type de retour final, la fonction déduit correctement le type de résultat pour un nombre quelconque d'arguments :

template <class T, class... P>
auto sum(const T& t, const P&amp;... p) -> typename sum_type<T,P...>::type
{
   return t + sum(p...);
}

Déduction de type améliorée

De plus, une modification de la dernière spécialisation de sum_type permet une déduction de type améliorée :

template<class T, class U, class... P> struct sum_type<T,U,P...>
: id<decltype(
      val<T>()
    + val<typename sum_type<U,P...>::type>()
)>{};

Cela garantit que le type de retour correspond à decltype(a (bc)), en s'alignant sur l'ordre d'addition attendu.

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