Maison  >  Article  >  développement back-end  >  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 ?

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
Linda Hamiltonoriginal
2024-11-06 06:25:02476parcourir

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>

Au lieu de l'implémentation actuelle :

<code class="cpp">GCPtr<A> ptr1 = GC::Allocate<A>();
GCPtr<B> ptr2 = GC::Allocate<B>();</code>

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>

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>

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>

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!

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