2014-12-25 2 views
3

std::function 파생 된 인수로 바인딩하려고합니다. 기능 내가 바인딩 할은 다음과 같습니다파생 클래스로 인수가있는 함수 바인딩

void Storage::register(int number, std::function<void(Base *base)>) { } 

그리고이이 (this 키워드를하고있는 중이 야 : 나는 (그러나 바운드)이 함수에 전달하는 데 노력하고

void Application::myFunction(Derived *derived) { } 

기능은 다음과 같습니다

myStorage->register(0, std::bind(&Application::myFunction, this, std::placeholders::_1); 

그러나 그것은 나에게 오류 제공 : 문맥 Application)입니다

error: no matching function for call (Storage::register...)

내가 뭘 잘못하고 있는거야? 고맙습니다!

+0

제시된대로 디자인이 잘못되었습니다. 바인드 연산의 결과가 '파생 된 *'이 아닌 'Base *'로 호출된다고 가정 해보십시오. 이것은 'Application :: myFunction'이라는 이름의'Base * '와 항상 동일 할 것입니다. 이는 항상 의미가있는 것은 아닙니다. 그래서, 정확히 무엇을하려고합니까? 왜 당신의 유스 케이스에는 이것이 문제가되지 않습니까? – Pradhan

답변

3

std::function<void(Base*)>은 항상 Derived*과 함께 호출된다는 것을 보장하지 않기 때문에 작동하지 않습니다. 을 Base*으로 직접 부르는 것보다 더 이상 할 수 없습니다.

달성하고자하는 바에 따라 std::function<void(Derived *)>으로 만들거나 myFunctionBase*과 함께 사용하십시오.

+0

더 많은 (그 클래스의 약 10-15 파생물) – Gelidus

+0

이 있기 때문에 그것을 std :: function 만들 수 없습니다. 그러나 그것은 정확하게 문제입니다. '파생 된'을 받아들이는 함수를 다른 파생 된 클래스의 객체에 대한 포인터와 함께 제공 할 장소에 저장하면'Derived '가 아닌 객체에 대한 포인터로 그 함수를 호출하게 될 것입니다. 일이 폭발 할 것입니다. 아마도'Base'에게 충분한 인터페이스를 주어야합니다.'myFunction'은 그것이 작동하는 객체가 어느 특정 파생 클래스에 속해 있는지에 관계없이 (두 번째 옵션이 수반하는 것입니다). – Wintermute

+0

함수 포인터처럼 C를 캐스팅 할 때 문제가되지 않았습니다. 이러한 C++ 11 템플리트와 같은 랩. – Gelidus