Le langage C permet l'inférence des paramètres de modèle à partir des paramètres de fonction, mais pas à partir des constructeurs de classe. Cela peut soulever la question : pourquoi ne pas autoriser cette inférence pour les constructeurs ?
L'une des raisons pour lesquelles l'inférence de modèle n'est pas autorisée pour les constructeurs est que les constructeurs ne sont pas le seul point d'entrée pour une classe. Les constructeurs de copie et les opérateurs d'affectation fournissent des moyens supplémentaires pour créer des objets d'une classe. Autoriser l'inférence de modèle pour les constructeurs nécessiterait que le compilateur prenne en compte tous ces points d'entrée lors de la détermination des paramètres du modèle, ce qui pourrait conduire à une ambiguïté syntaxique.
class MyClass { int a; int b; public: MyClass(int a, int b): a(a), b(b) {} };
Dans cet exemple, si l'inférence de modèle était autorisée pour les constructeurs, il ne serait pas clair quels paramètres de modèle doivent être utilisés lors de la création d'un objet MyClass à l'aide du constructeur de copie ou de l'opérateur d'affectation.
Une autre raison pour laquelle l'inférence de modèle n'est pas autorisée pour les constructeurs est que cela pourrait conduire à un comportement inattendu. Considérez le code suivant :
class MyContainer { std::vector<T> vec; }; int main() { MyContainer<int> container; // explicitly specify template parameter MyContainer container2(vec); // infer template parameter from constructor }
Dans cet exemple, la classe MyContainer peut être construite avec soit un paramètre de modèle explicitement spécifié, soit un vecteur d'un type spécifique. Si l'inférence de modèle était autorisée pour les constructeurs, la deuxième ligne de code créerait un MyContainer de type T. Cependant, ce n'est peut-être pas le comportement prévu, car l'utilisateur a peut-être voulu créer un MyContainer de type int.
En raison de ces problèmes, l'inférence de modèle n'est pas autorisée pour les constructeurs de classe. Cependant, en C 17, une spécialisation partielle des modèles peut être utilisée pour obtenir un effet similaire. La spécialisation partielle du modèle permet à l'utilisateur de spécifier les paramètres du modèle pour un type spécifique, tout en laissant d'autres paramètres du modèle être déduits.
template <typename T> class MyContainer { std::vector<T> vec; }; template <> class MyContainer<int> { std::vector<int> vec; }; int main() { MyContainer container; // infer template parameter to 'int' MyContainer<double> container2; // explicitly specify template parameter }
Dans cet exemple, la classe MyContainer a une spécialisation partielle du modèle pour int. Cela signifie que lorsqu'un MyContainer est créé avec un type int, le paramètre de modèle sera automatiquement déduit qu'il s'agit d'un int. Pour les autres types, le paramètre de modèle doit être explicitement spécifié.
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!