Maison > développement back-end > C++ > Comment stocker des fonctions avec différentes signatures dans une carte en C ?

Comment stocker des fonctions avec différentes signatures dans une carte en C ?

Mary-Kate Olsen
Libérer: 2024-11-14 15:54:02
original
399 Les gens l'ont consulté

How to Store Functions with Different Signatures in a Map in 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&amp;&amp; ... 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"] = &amp;foo;
    map["bar"] = &amp;bar;
    
    map["foo"](1, 2);
    map["bar"]("Hello", 1, 2);
}
Copier après la connexion

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!

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