Maison >développement back-end >C++ >Comment puis-je empêcher les conversions implicites pour les types de fonctions qui ne correspondent pas en C ?

Comment puis-je empêcher les conversions implicites pour les types de fonctions qui ne correspondent pas en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-30 11:39:12662parcourir

How Can I Prevent Implicit Conversions for Non-Matching Function Types in C  ?

Prévenir les conversions implicites pour les types de fonctions qui ne correspondent pas

En C, les fonctions peuvent prendre des paramètres de différents types. Cela inclut les types définis par l'utilisateur, qui peuvent être transmis comme arguments de fonction par conversion implicite. Cependant, dans certains scénarios, il peut être souhaitable d'empêcher ce casting implicite et de restreindre les appels de fonction aux seuls arguments qui correspondent à la signature de fonction déclarée.

Pour éviter les conversions implicites pour les fonctions non constructives, le mot-clé explicite peut être utilisé. Cependant, cette approche ne fonctionne que pour les fonctions de construction, pas pour les fonctions non constructrices.

Une solution à ce problème consiste à définir un modèle de fonction qui correspond à tous les autres types. Cette technique donne la priorité à la fonction modèle pour les types qui ne correspondent pas, les empêchant d'être transmis à la fonction d'origine avec la signature de fonction exacte.

Exemple :

// Original function signature requires an int
void function(int);

// Function template matches all other types
template <class T>
void function(T) = delete; // C++11 

Cette approche garantit que la fonction d'origine avec la signature exacte function(int) n'est invoquée que lorsqu'un argument entier est passé. Tout le reste, comme des caractères ou des longs, déclenche le modèle de fonction et entraîne une erreur de compilation.

Méthode pré-C 11 :

Pour les versions C antérieures à C 11, une technique différente peut être utilisée :

// Creating a class to handle overload deletion
class DeleteOverload {
private:
    DeleteOverload(void*);
};

// Function template with overload deletion
template <class T>
void function(T a, DeleteOverload = 0);

// Original function with exact signature
void function(int a) {}

Dans cette approche, la classe DeleteOverload ne peut pas être instanciée, interdisant effectivement son utilisation comme argument de modèle. Cela force tous les types non correspondants à déclencher la fonction de modèle et leur interdit d'atteindre la fonction d'origine avec la signature exacte.

Version C 23 :

C 23 introduit la fonctionnalité static_assert, qui peut être utilisée pour plus de clarté dans ce scénario :

void function(int); // Chosen for ints

template <class T>
void function(T) {
    static_assert(false, "function should only be called for ints");
}

int main() {
    function(1);
    // function(1l); // Error: static assertion failed
}

En employant cette méthode, le message d'erreur est clairement indique que la fonction est destinée uniquement aux entiers, améliorant ainsi la lisibilité et la compréhension du code.

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!

Déclaration:
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