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 ?
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!