Maison >développement back-end >C++ >Comment utiliser « decltype » avec des fonctions de modèle variadiques pour additionner des arguments ?

Comment utiliser « decltype » avec des fonctions de modèle variadiques pour additionner des arguments ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-13 04:48:02848parcourir

How to Use `decltype` with Variadic Template Functions to Sum Arguments?

Utilisation de decltype avec des fonctions de modèle variadique

Lorsque vous essayez d'écrire une fonction de modèle variadique qui renvoie une somme avec un type approprié à l'aide de decltype, elle Il est possible de rencontrer des problèmes inattendus.

Le problème

Initialement, une fonction est déclarée sans type de retour final. Cependant, lorsque plusieurs arguments lui sont transmis, le compilateur interprète la fonction comme non définie. Déclarer la fonction avec un type de retour final résout le problème pour plus de deux arguments mais entraîne des types de retour incorrects pour des arguments de types différents.

Le problème

decltype est impossible de déduire le type de t sum(p...) pour plus de deux arguments car le modèle de fonction variadique n'est déclaré qu'une fois le type de retour spécifié.

La solution de contournement

Pour éviter cet appel récursif dans decltype, une classe de traits personnalisés peut être utilisée. La classe sum_type détermine le type de somme pour plusieurs arguments sans avoir besoin de déduction récursive.

Code mis à jour

Remplacez decltype dans votre programme par le nom de type sum_type::type comme indiqué :

#include <iostream>
#include <type_traits>
using namespace std;

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

Cette méthode renvoie decltype((a b) c) au lieu de decltype(a (bc)). Pour un résultat plus précis de decltype(a (bc)), modifiez la dernière spécialisation comme suit :

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

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