Maison >développement back-end >C++ >Comment puis-je stocker des fonctions avec des signatures variables dans une carte en C ?
Stockage de fonctions avec des signatures variées dans une carte
En C , vous pouvez rencontrer le besoin de stocker des fonctions avec des signatures variées dans une carte, où la clé est une chaîne et la valeur est une méthode générique. Bien que cela puisse sembler difficile au premier abord, c'est possible avec l'aide de l'effacement de type et d'un opérateur de modèle.
Effacement de type
Pour activer le stockage de fonctions avec différentes signatures dans une carte , nous les effaçons d’abord dans un conteneur. Cela implique de convertir les types de fonctions en une représentation commune qui peut être stockée et récupérée à partir de la carte.
Opérateur de modèle
Une fois les types de fonctions effacés, nous fournissons un opérateur de modèle () pour la carte. Cet opérateur prend la fonction stockée en entrée et nous permet de l'appeler avec des paramètres spécifiques au moment de l'exécution. Les paramètres fournis doivent correspondre exactement à la signature de fonction d'origine. S'ils ne le font pas, l'opérateur lancera une exception std::bad_any_cast.
Exemple
Voici un exemple de la façon dont cela peut être implémenté :
#include <any> #include <functional> #include <map> #include <string> #include <iostream> template<typename Ret> struct AnyCallable { //... }; void foo(int x, int y) { //... } void bar(std::string x, int y, int z) { //... } using namespace std::literals; int main() { // Initialize the map std::map<std::string, AnyCallable<void>> map; // Store functions in the map map["foo"] = &foo; map["bar"] = &bar; // Call the stored functions with parameters map["foo"](1, 2); map["bar"]("Hello, std::string literal"s, 1, 2); }
Dans cet exemple, nous définissons une structure wrapper AnyCallable qui efface les fonctions et fournit un opérateur de modèle () pour appeler eux.
Considérations
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!