Déduction d'arguments de modèle et conversion de type implicite
En C, la déduction d'arguments de modèle est une fonctionnalité puissante qui détermine automatiquement les types de paramètres de modèle en fonction sur les arguments de l'appelant. Cependant, certains types de conversions ne sont pas pris en compte lors de la déduction, notamment les conversions définies par l'utilisateur.
Problème de conversion implicite
Considérez l'extrait de code suivant :
<code class="cpp">template<typename Dtype> class Scalar{ Scalar(Dtype v) : value_(v){} private: Dtype value_; };</code>
La classe Scalar représente un type de valeur simple. Considérons maintenant la fonction modèle suivante :
<code class="cpp">template<typename Dtype> void func(int a, Scalar<Dtype> b){ cout << "ok" <<endl; }</code>
Cette fonction prend un int et un Scalar
Dans la fonction principale suivante, nous essayons d'appeler func avec un int et une valeur int :
<code class="cpp">int main(){ int a = 1; func(a, 2); // ERROR: template argument deduction fails return 0; }</code>
Mais cela entraîne une erreur de compilation, indiquant que le modèle la déduction des arguments a échoué. En effet, le compilateur ne peut pas convertir automatiquement la valeur int 2 en valeur Scalar
Solutions possibles
Pour corriger ce problème, vous disposez de plusieurs options :
Conversion explicite sur le site de l'appelant :
<code class="cpp">func(a, Scalar<int>(2));</code>
Cela convertit manuellement la valeur int en Scalar< ;int> objet avant de le passer à func.
Guide de déduction : (C 17 uniquement)
Ajouter un guide de déduction pour Scalar :
<code class="cpp">template<typename T> Scalar(T v) -> Scalar<T>;</code>
Cela indique au compilateur de préférer ce guide de déduction lors de la déduction du type de scalaire à partir de l'argument de l'appelant, vous permettant d'appeler func comme :
<code class="cpp">func(a, 2);</code>
Instanciation explicite :
Vous pouvez explicitement instancier func pour un type spécifique :
<code class="cpp">func<int>(a, 2);</code>
Cela oblige le compilateur à instancier la fonction avec Dtype = int, évitant ainsi le besoin de déduction d'argument de modèle.
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!