Maison > développement back-end > C++ > le corps du texte

La déduction de modèle peut-elle déduire des arguments de type basés uniquement sur le type de retour de fonction en C ?

Linda Hamilton
Libérer: 2024-11-06 06:25:02
original
473 Les gens l'ont consulté

Can Template Deduction Infer Type Arguments Based Solely on Function Return Type in C  ?

Modèle de déduction pour une fonction basée sur son type de retour : une exploration

Introduction

Dans C , la déduction de modèle permet au compilateur de déduire les arguments de type lors de l'appel d'une fonction basée sur un modèle en fonction des arguments réels fournis. Cela peut simplifier le code en supprimant le besoin de spécifier explicitement des arguments de type.

Le scénario proposé

Le problème donné présente un scénario dans lequel l'utilisateur souhaite utiliser la déduction de modèle pour allouer de la mémoire pour des objets de différents types à l’aide d’une fonction générique Allouer. Plus précisément, ils souhaitent obtenir le code suivant :

<code class="cpp">GCPtr<A> ptr1 = GC::Allocate();
GCPtr<B> ptr2 = GC::Allocate();</code>
Copier après la connexion

Au lieu de l'implémentation actuelle :

<code class="cpp">GCPtr<A> ptr1 = GC::Allocate<A>();
GCPtr<B> ptr2 = GC::Allocate<B>();</code>
Copier après la connexion

Modèle de la fonction d'allocation

Le modèle de fonction Allocate actuel est défini comme suit :

<code class="cpp">template <typename T>
static GCPtr<T> Allocate();</code>
Copier après la connexion

Cependant, il n'est pas possible d'obtenir la déduction de modèle souhaitée en utilisant uniquement le type de retour. Le processus de déduction de type repose principalement sur les arguments de la fonction.

Une solution de contournement avec une fonction d'assistance

Pour surmonter cette limitation, une fonction d'assistance peut être utilisée pour masquer le type explicite. argument comme indiqué ci-dessous :

<code class="cpp">// Helper function
template <typename T>
void Allocate( GCPtr<T>& p ) {
   p = GC::Allocate<T>();
}

// Usage
int main()
{
   GCPtr<A> p = 0;
   Allocate(p);
}</code>
Copier après la connexion

Syntaxe alternative avec C 11

C 11 introduit une syntaxe qui permet d'ignorer la déclaration de type explicite lors de la déduction du modèle :

<code class="cpp">auto p = GC::Allocate<A>();   // p is of type GCPtr<A></code>
Copier après la connexion

Conclusion

Bien qu'il ne soit pas possible de s'appuyer uniquement sur la déduction de modèle via le type de retour, l'utilisation d'une fonction d'assistance ou de la syntaxe C 11 peut fournir une alternative pratique qui s'aligne avec le comportement souhaité. Ces techniques permettent l'allocation de différents types d'objets avec une syntaxe simplifiée, réduisant ainsi le besoin d'arguments de type explicites.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!