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

Comment puis-je stocker des fonctions avec des signatures variables dans une carte en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-19 09:26:03415parcourir

How can I store functions with varying signatures in a map in 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

  • Il est important de noter qu'en raison de l'effacement de type, vous devez spécifier des paramètres qui correspondent exactement à la signature de fonction d'origine.
  • Si vous essayez d'appeler une fonction stockée avec des paramètres incompatibles, l'opérateur lancera un std::bad_any_cast exception.

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