2017-01-30 3 views
0

Je viens de C# alors s'il vous plaît excuser tout ce que je peux me tromper en essayant de poser cette question.Passer un paramètre de modèle générique à partir d'une carte?

J'ai créé une carte qui contient une chaîne et une méthode pour gérer l'invocation d'une méthode par une chaîne:

//MyClass.h 
void SerializeCustomData(); 
std::unordered_map<std::string, void(MyClass::*)()> functionMap; 

MyMethod() { 
    functionMap["SerializeCustomData"] = &MyClass::SerializeCustomData; 
}; 

Ma question est; Comment puis-je avoir ma carte dans un paramètre pour la méthode? Un type générique ou une chaîne en C++?

Exemple:

SerializeCustomData(std::string); 
+0

Je recommande d'utiliser 'std :: function' à la place des pointeurs de fonctions membres en général. – milleniumbug

+0

Vous recherchez un conteneur pour ces paramètres? Si vous êtes, essayez d'utiliser std :: function et std :: bind. –

+1

@mileniumbug merci, donc le haut de ma tête, il ressemble à ceci: 'std :: unordered_map > functionMap;' – i73

Répondre

0
#include <functional> 
#include <iostream> 
#include <unordered_map> 

class MyClass 
{ 
    std::unordered_map<std::string, std::function<void(MyClass&, std::string)>> functionMap; 
public: 
    void MyMethod() 
    { 
     functionMap.emplace("SerializeCustomData", &MyClass::SerializeCustomData); 
    } 

    void CallSerialize() 
    { 
     functionMap.at("SerializeCustomData")(*this, "argument"); 
    } 

    void SerializeCustomData(std::string s) 
    { 
     std::cout << "hello: " << s << "\n"; 
    } 
}; 

int main() 
{ 
    MyClass c; 
    c.MyMethod(); 
    c.CallSerialize(); 
} 

Ici, la fonction de la carte est appelée avec un argument MyClass& et une chaîne. Notez que le MyClass n'est pas lié au rappel, et donc nous le passons explicitement.

+0

Parfait merci! – i73