2017-09-28 6 views
1

멤버 함수의 콜백을 처리하기 위해 최신 버전의 C++에서 더 나은 선택 인 just를 문의하십시오. 도움이된다면 도움이 될 것입니다.멤버 함수 콜백에 대한 바인드 또는 람다 C++ 14

template<class T> 
void addCallBack(void(T::*someFunc)(int), T* instance) { 
    func = std::bind(someFunc, instance, _1); 
} 
std::function<void(int)> func ; 

또는

template<class T> 
void addCallBack(T* instance) { 
    func = [&instance](int x) { 
     instance->someFunc(x); 
    } 
} 
std::function<void(int)> func; 
+0

"더 좋음"을 정의하십시오. – stark

+2

Lambda는 성능면에서 (그리고 명확성 측면에서) 'bind'보다 거의 항상 낫다. – 0x5453

+0

작업, 올바른 방법, 좋은 프로그래밍 연습 등에 더 적절합니다. C++에서 대부분의 작업을 수행하는 방법이 100 가지이며이 경우에 올바른 방법이 있는지 또는 중요한지 알고 싶습니다. – user3220058

답변

4

이 :

template<class T> 
void addCallBack(T* instance) { 
    func = [&instance](int x) { 
     instance->someFunc(x); 
    } 
} 

addCallBack()의 끝에서 범위를 벗어나 참조하여 인수 instance을 캡처 그래서 당신은 매달려 참조하여 결국 . 그래서, 확실히 이 아니라입니다.

싶은 것은 :

func = [instance](int x){ instance->someFunc(x); } 

하거나 :

func = [=](int x){ instance->someFunc(x); } 

지금 기능적 차이 & 단검있을려고하고 있지 않다; 그 사이 :

func = std::bind(&T::someFunc, instance, std::placeholders::_1); 

그러나 람다 전형적 (이 경우에서와 같이) 읽기 쉽고, 인라인 용이하고 임의의 복잡한 일을 더 할 수있다 할 것이다. 후자의 두 가지는이 경우 중요하지 않지만 기본적으로 항상 람다를 선호하는 좋은 이유입니다.


& dagger; 물론, someFunc이 과부하 이름 인 경우 작동하지 않습니다. 이는 람다를 선호하는 또 다른 이유 중 하나입니다. 항상 작동합니다.

+0

실용적인 기능상의 차이점은 없지만 유형 (미친 듯이 복잡하지만)은 람다와 같이 고유 한 것이 보장되지 않으므로 실제로 std 함수의주의를 가지고 바인드 표현식을 추출 할 수 있습니다. * 기능상의 차이는 없습니다. 정상적인 코드베이스에서는 실제적인 차이가 없습니다. – Yakk