Maison > développement back-end > C++ > Comment puis-je empêcher les conversions implicites dans les fonctions C non constructives ?

Comment puis-je empêcher les conversions implicites dans les fonctions C non constructives ?

Barbara Streisand
Libérer: 2024-12-01 08:55:11
original
357 Les gens l'ont consulté

How Can I Prevent Implicit Conversions in Non-Constructing C   Functions?

Éviter les conversions implicites dans les fonctions non constructives

Formulation du problème :

En C, les fonctions non constructives peuvent implicitement convertir des paramètres pour qu'ils correspondent à leurs types déclarés. Ce comportement, bien que pratique dans certains cas, peut conduire à des résultats inattendus ou à des erreurs de compilation lorsque vous tentez de restreindre les paramètres de fonction à des types spécifiques.

Solution :

Pour éviter les erreurs implicites conversions et garantir qu'une fonction non constructive n'accepte que des paramètres d'un type spécifique, les techniques suivantes peuvent être utilisées :

1. Surcharge de fonctions avec suppressions de modèles (C 11 et versions ultérieures) :

Définissez une surcharge de fonctions avec un type de modèle spécifique qui correspond au type d'argument souhaité. Ensuite, déclarez un autre modèle de fonction qui est supprimé pour tous les autres types. Cela désactive efficacement les conversions implicites pour cette fonction :

void function(int);

// Delete overload for all other types
template<class T>
void function(T) = delete;
Copier après la connexion

2. Suppression de surcharge de fonctions basée sur les classes (pré-C 11) :

Une approche plus ancienne pour empêcher les conversions implicites impliquait la création d'une classe avec un constructeur privé qui prend des pointeurs vides. L'instanciation de cette classe avec les arguments de modèle appropriés supprimera toutes les surcharges qui ne correspondent pas :

class DeleteOverload
{
private:
    DeleteOverload(void*);
};

template<class T>
void function(T a, DeleteOverload = 0);

void function(int a)
{}
Copier après la connexion

3. Assertions statiques (C 23 et versions ultérieures) :

C 23 introduit la possibilité d'utiliser des assertions statiques pour vérifier qu'une fonction est appelée avec le type correct. Cette approche fournit un message d'erreur plus explicite et informatif par rapport aux méthodes précédentes :

void function(int) {}

template<class T>
void function(T) {
    // Static assertion fails when called with non-matching types
    static_assert(false, "function shall be called for int only");
}
Copier après la connexion

En utilisant l'une de ces techniques, il est possible de restreindre une fonction non constructive pour accepter des paramètres d'un type spécifique et empêcher les conversions implicites de se produire.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal