Maison  >  Article  >  développement back-end  >  La déduction de modèle peut-elle fonctionner en fonction du type de retour d'une fonction en C ?

La déduction de modèle peut-elle fonctionner en fonction du type de retour d'une fonction en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-06 05:35:02692parcourir

Can Template Deduction Work Based on a Function's Return Type in C  ?

Déduction de modèle pour une fonction en fonction de son type de retour ?

En C, la déduction de modèle fournit un moyen pratique de déterminer les arguments de modèle en fonction du arguments fournis à un appel de fonction. Cependant, il existe certaines limites à la déduction de modèles, telles que l'incapacité de déduire des arguments de type en fonction du type de retour d'une fonction.

Le problème :

L'original La question cherche à éliminer le besoin de spécifier explicitement des arguments de type lors de l'appel de la fonction Allocate() dans le code suivant :

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

La réponse :

Malheureusement, le modèle la déduction ne peut pas être utilisée pour déduire les arguments de type en fonction du type de retour. Au lieu de cela, c'est l'inverse : le type de retour est déterminé une fois que la signature du modèle a été mise en correspondance.

Solution de contournement :

Pour contourner cette limitation, l'attribut Allocate( ) peut être enveloppée dans une fonction d'assistance qui masque l'argument de type à l'appelant :

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

int main() {
   GCPtr<A> p = 0;
   Allocate(p);
}</code>

Cela permet à l'appelant d'utiliser la fonction Allocate() sans spécifier explicitement l'argument de type :

<code class="cpp">GCPtr<A> p = 0;
Allocate(p);</code>

Remarque supplémentaire :

C 11 introduit le mot-clé auto, qui permet au compilateur de déduire le type de l'initialiseur. Cela simplifie encore le code :

<code class="cpp">auto p = GC::Allocate<A>(); // p is of type GCPtr<A></code>

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