Maison > Article > développement back-end > Comment stocker des fonctions avec différentes signatures dans une carte en C ?
Stockage de fonctions avec des signatures distinctes dans une carte
En C , créer une carte avec des clés de chaîne et des fonctions génériques comme valeurs pose un défi. Cependant, en utilisant une combinaison d'effacement de type et d'un opérateur basé sur un modèle (), cela peut être réalisé.
L'effacement de type permet le stockage de différents types de fonctions dans un seul conteneur, tandis que l'opérateur basé sur un modèle () donne accès au fonctions stockées. L'exemple de code ci-dessous illustre cette approche :
#include <any> #include <functional> #include <map> #include <string> template<typename Ret> struct AnyCallable { template<typename ... Args> Ret operator()(Args&& ... args) { ... } std::any m_any; }; void foo(int x, int y) { ... } void bar(std::string x, int y, int z) { ... } int main() { std::map<std::string, AnyCallable<void>> map; map["foo"] = &foo; map["bar"] = &bar; map["foo"](1, 2); map["bar"]("Hello", 1, 2); }
Dans cette solution, la classe AnyCallable agit comme un wrapper autour des fonctions stockées, fournissant l'opérateur modélisé(). Les pointeurs de fonction &foo et &bar sont convertis en objets std::function avant d'être stockés dans le membre m_any. Lorsque les fonctions stockées sont invoquées, elles sont converties en type de fonction approprié et exécutées.
Il est important de noter qu'en raison de l'effacement du type, les arguments correspondants doivent être fournis sur le site d'appel. De plus, la constance des arguments de fonction est significative, car différentes surcharges peuvent être créées avec le même nombre d'arguments mais des qualificatifs différents.
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!