Évitement de conversion implicite pour les fonctions non constructives
Considérez une fonction non constructive qui attend un paramètre entier mais autorise la conversion implicite à partir d'autres types tels que les caractères, les booléens et les longs. Pour éviter ce comportement involontaire et garantir que la fonction n'accepte que les paramètres du type spécifié, nous pouvons utiliser les techniques suivantes :
Méthode C 11 et versions ultérieures :
La L'approche la plus directe consiste à définir un modèle de fonction qui correspond à tous les autres types :
void function(int); // this will be selected for int only template <class T> void function(T) = delete; // C++11
Cela fonctionne car les fonctions non-modèles avec correspondance directe prennent priorité.
Technique pré-C 11 :
Avant C 11, une solution alternative impliquait la création d'une classe d'assistance pour appliquer le comportement souhaité :
// because this ugly code will give you compilation error for all other types class DeleteOverload { private: DeleteOverload(void*); }; template <class T> void function(T a, DeleteOverload = 0); void function(int a) {}
Cette technique repose sur la surcharge de plusieurs fonctions avec des signatures similaires, où la fonction avec le type attendu prend priorité.
Mise à jour C 23 :
C 23 introduit une manière plus concise et informative de gérer cette situation :
void function(int) {} // this will be selected for int only template <class T> void function(T) { // since C++23 static_assert(false, "function shall be called for int only"); }
Utilisation de static_assert dans un modèle de fonction fournit un message d'erreur clair lors de l'appel de la fonction avec un type de paramètre inattendu.
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!