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

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

Linda Hamilton
Libérer: 2024-12-03 08:18:18
original
316 Les gens l'ont consulté

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

É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
Copier après la connexion

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)
{}
Copier après la connexion

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");
} 
Copier après la connexion

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!

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