2015-07-15 10 views
6

Mam klasę o nazwie Reciever, która ma funkcję o nazwie recieve(const Event *), gdzie Event dziedziczy po BaseEvent. Chcę utworzyć powiązanie z konkretnym wystąpieniem tej klasy. Instancja nazywa się rec. Służą do tego I:Jak rzutować funkcję z argumentem pochodnym na funkcję z argumentem podstawowym?

void(Reciever::*func)(const Event *) = &Reciever::recieve; 
auto recievePtr = std::bind(func, &rec, std::placeholders::_1); 

Jednak gdy próbuję zapisać to w wektorze, muszę podać std::function że trwa BaseEvent jako wejście, a nie Event, jak tak:

std::vector<std::function<void(const BaseEvent*)>> 

Jak mogę rzucić recievePtr, aby można było go poprawnie zapisać w wektorze? Czy to możliwe? Problem z wykorzystaniem wskaźnika funkcji w BaseEvent jest to, że może mieć wiele Recieverrecieve() metod z różnych klas pochodnych oparte na BaseEvent

Odpowiedz

2

Można spróbować czegoś wzdłuż poniżej. To skompilowane i uruchomione dobrze na moim komputerze. Zestaw narzędzi platformy narzędziowej Visual Studio v120.

Reciever rec; 

std::vector<std::function<void(const BaseEvent*)>> vector; 

vector.push_back(
    [&rec](const BaseEvent* event) 
{ 
    rec.recieve(static_cast<const Event*>(event)); 
}); 

vector.push_back(
    [&rec](const BaseEvent* event) 
{ 
    rec.recieve(static_cast<const EventD*>(event)); 
}); 

const BaseEvent* e = new Event(); 
const BaseEvent* d = new EventD(); 

vector[0](e); 
vector[1](d); 
+0

Hmm, to usuwa nadmiar wiązania. Zastanawiam się, czy jest lepszy sposób. – user975989

Powiązane problemy