2015-07-15 15 views
6

Ich habe eine Klasse mit dem Namen Reciever, die eine Funktion namens recieve(const Event *) hat, wobei Event von BaseEvent erbt. Ich möchte eine Bindung zu einer bestimmten Instanz dieser Klasse erstellen. Die Instanz heißt rec. Um dies zu tun ich Gebrauch:Wie kann ich eine Funktion mit einem abgeleiteten Argument in eine Funktion mit einem Basisargument umwandeln?

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

Allerdings, wenn ich versuche, diese zu speichern, in einem Vektor, muß ich ein std::function angeben, die ein BaseEvent als Eingabe verwendet, und keine Event, etwa so:

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

Wie kann ich recievePtr umwandeln, damit ich es richtig im Vektor speichern kann? Ist das überhaupt möglich? Das Problem mit einer Funktion Zeiger auf eine BaseEvent ist, dass die Reciever mehrere recieve() Methoden mit verschiedenen abgeleiteten Klassen basieren alle haben auf BaseEvent

Antwort

2

Sie etwas in der folgenden versuchen. Dies kompilierte und lief gut auf meiner Maschine. Visual Studio-Targeting-Plattform-Toolset 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, das entfernt den Overhead der Bindung. Ich frage mich, ob es einen besseren Weg gibt. – user975989

Verwandte Themen