2016-07-22 36 views
-1

Ich habe einige Links vor dem Stellen dieser Frage gelesen und ziemlich viel um std :: function, std: bind und callbacks in C++ gelesen. Wie ich es verstehe, dient das Konzept hauptsächlich dazu, dass Event-Handler die Zuhörer nach einem bestimmten Ereignis benachrichtigen. Ich habe Mühe, die richtige Implementierung zu finden, wenn es über die Grenzen der Bibliothek hinaus gilt, denn ich bin ein Neuling in diesem Stil der Programmierung.C++ std :: function bind Callback zwischen Bibliotheken ohne Exposing-Methode API

Hier ist die Situation oder das Design I implementieren müssen:

Ich habe eine Bibliothek A, die eine private Funktion in einer Klasse hat, die in bestimmten Daten akzeptiert und führt einige Verarbeitung. Es gibt eine BibliothekB, die dieselben Daten bereitstellt, die die Funktion in Bibliothek A benötigt, aber BibliothekB macht eine std :: -Funktion verfügbar, um diese Daten zu empfangen. Eine andere Bibliothek muss ihre Funktion an ihren Rückruf binden, um die Daten zu empfangen. Also, ich muss BibliothekA func an Bibliothek B std :: -Funktion in meiner Application-Klasse binden.

Inside libraryA { 

Class A { 

private: 
    AA objAA; 
} 

Class AA { 

private: 
    void func(int x) { 
     //this is the function I want to tie to calback in library libB without exposing the method api 
     //How can I expose a public api to return the address of this function so that the app can bind it to libraryB's callback ? 
    } 
} 

} 

Inside libraryB { 

Class B { 
public: 
    void registerCallback(std::function<void (int)> callmePls) { 
     m_callback = callmePls; 
    } 
private: 
    typedef std::function<void (int)> theCallback; 
    theCallback m_callback; 
} 

} 


Inside my Application which uses both libraryA & libraryB { 
//How can I bind/assign “func” in libraryA to the callback in libraryB ? 
} 

Wie kann ich eine öffentliche api von libraryA aussetzen die Adresse der betroffenen Funktion zurückkehren, so dass die App es BibliothekB Rückruf binden kann? Wie kann ich "func" in libraryA an den Callback in libraryB binden/zuweisen?

Antwort

0

mit dem implementierten Körper in einer .cpp Datei (nicht im Header):

class A { 
public: 
    void listen(int x) { 
    objAA.func(x); 
    } 

oder

std::function<void(int)> get_listener() { 
    return [this](int x){ x.objAA.func(x); }; 
    } 

oder

void listen_to(std::function< void(std::function< void(int) >) > f) { 
    f([this](int x){ x.objAA.func(x); }); 
    } 

hier, haben Sie einige Gymnastik zu tun um registerCallback in listen_to zu erhalten.

Wirklich, die späteren sind abstrakter, aber sie verhindern nicht wirklich, dass Sie func anrufen.

+0

Danke für die lebendige Antwort. In der zweiten Lösung muss ich eine std :: -Funktion aus BibliothekA bekommen und dem Callback der BibliothekB zuweisen? –

+0

@NelsonP Ja, ich habe die 'Klasse A'-Schnittstelle hinzugefügt. – Yakk