Maison  >  Article  >  développement back-end  >  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
Mary-Kate Olsenoriginal
2024-11-14 15:54:02328parcourir

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);
}

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!

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