2016-07-22 8 views
-1

この質問をする前にかなりのリンクを見てきましたが、std :: function、std:bindおよびC++のコールバックについてかなり読んでいます。私が理解しているように、このコンセプトは、イベントハンドラが特定のイベントが発生した後にリスナーに通知することが主な目的です。私はプログラミングのこのスタイルに初心者であるので、ライブラリの境界を越えて適用されるとき、私は正しい実装を見つけるのに苦労しています。私は、ライブラリを持ってC++ std :: functionメソッドを公開せずにライブラリ間でコールバックをバインドするAPI

の中で特定のデータを受け取り、何らかの処理を行うクラスのプライベート機能を有する:

は、ここで私が実装する必要がある状況やデザインです。ライブラリAに必要な機能と同じデータを提供するライブラリBがありますが、ライブラリBはstd ::関数を公開してそのデータを受け取ります。他のライブラリは、その関数をそのコールバックにバインドしてデータを受け取る必要があります。ですから、libraryAのfuncを、私のアプリケーションクラスのlibraryBのstd ::関数にバインドする必要があります。

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 ? 
} 

にはどうすればアプリがlibraryBのコールバックにバインドできるように、興味のある関数のアドレスを返すためにlibraryAから公開APIを公開することができますか? libraryAの "func"をlibraryBのコールバックにバインドまたは割り当てる方法はありますか? (ないヘッダー内).cppファイルに実装機関と

答えて

0

:ここ

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

または

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

または

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

、あなたはいくつかの体操をしなければなりませんregisterCallbacklisten_toにする

実際は、後者の方が抽象的ですが、実際にfuncを呼び出すことはできません。

+0

鮮明な答えをありがとう。 2番目のソリューションでは、libraryAのstd :: functionを取得し、libraryBのコールバックに割り当てる必要があります。 –

+0

@NelsonPはい、私は 'class A'のインターフェースに追加しました。 – Yakk

関連する問題