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 ?
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
template <class T, class... P> auto sum(const T& t, const P&... 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!