2017-01-30 10 views
0

Я прихожу из C#, поэтому, пожалуйста, простите все, что я могу ошибаться, пытаясь задать этот вопрос.Передача общего шаблона с карты?

Я создал карту, которая содержит строку и метод для обработки вызова метода строкой:

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

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

Мой вопрос является; как я могу взять свою карту в параметре для метода? Или общий тип или строка в C++?

Пример:

SerializeCustomData(std::string); 
+0

Я рекомендую использовать 'std :: function' вместо указателей функций-членов в целом. – milleniumbug

+0

Вы ищете контейнер для этих параметров? Я, вы, попробуйте использовать std :: function и std :: bind. –

+1

@mileniumbug спасибо, поэтому от верхней части моей головы это выглядело бы так: 'std :: unordered_map > functionMap;' – i73

ответ

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

Здесь функция от карты вызывается с аргументом MyClass& и строки. Обратите внимание: MyClass не связан с обратным вызовом, поэтому мы передаем его явно.

+0

Прекрасное спасибо! – i73