Maison >développement back-end >C++ >Comment utiliser `decltype` avec une fonction de modèle variadique pour calculer la somme de ses arguments ?

Comment utiliser `decltype` avec une fonction de modèle variadique pour calculer la somme de ses arguments ?

DDD
DDDoriginal
2024-11-11 03:22:02932parcourir

How to Use `decltype` with a Variadic Template Function to Calculate the Sum of its Arguments?

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

Lors de la tentative de création d'une fonction qui accumule la somme de ses arguments à l'aide d'une fonction variadique modèle et la syntaxe du type de retour final, des défis surviennent. Plus précisément, le compilateur peut rencontrer des erreurs pour les fonctions comportant plus de deux arguments. En effet, le modèle de fonction variadique n'est considéré comme déclaré qu'après avoir spécifié son type de retour, ce qui entraîne une situation dans laquelle sum dans decltype ne peut pas faire référence au modèle de fonction variadique lui-même.

Une solution de contournement potentielle consiste à utiliser une classe de traits personnalisés pour évitez l'appel récursif dans l'expression decltype :

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

Cela permet de remplacer decltype dans le programme d'origine par le nom de type sum_type::type, permettant ainsi la réussite de la compilation.

Afin de garantir que la sommation respecte l'ordre des opérations (par exemple, a (bc)), la spécialisation finale de sum_type peut être modifiée 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