2016-07-22 3 views
-1

이 질문을하기 전에 많은 링크를 살펴본 결과 std :: function, std : bind 및 C++의 콜백을 꽤 많이 읽었습니다. 이해할 수 있듯이이 개념은 특정 이벤트가 발생한 후에 이벤트 핸들러가 청취자에게 알리는 것입니다. 필자는이 스타일의 프로그래밍을 처음 시작할 때 라이브러리 경계에 걸쳐 적용될 때 올바른 구현을 찾기 위해 애를 먹고 있습니다. 나는 도서관을C++ std :: function 메서드 노출없이 라이브러리간에 콜백 바인딩

을 특정 데이터를 수용하고 일부 처리를 수행하는 클래스에서 개인 기능이있는 A :

는 여기가 구현해야하는 상황이나 디자인입니다. 라이브러리 A의 함수가 필요로하는 것과 동일한 데이터를 제공하는 libraryB가 있지만, libraryB는 std :: 함수를 노출하여 해당 데이터를받습니다. 다른 라이브러리는 데이터를 받기 위해 함수를 콜백에 바인딩해야합니다. 그래서 libraryA의 func을 내 Application 클래스의 libraryB의 std :: function에 바인딩해야합니다.

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 ? 
} 
I 앱이 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

생생한 대답에 감사드립니다. 두 번째 솔루션에서는 libraryA의 std :: function을 가져와 라이브러리 B의 콜백에 할당해야합니다. –

+0

@NelsonP 예, 클래스 A 인터페이스에 추가했습니다. – Yakk