2013-06-16 7 views
6

캡쳐 절이있는 λ 식으로 래핑하여 멤버 함수를 std::function에 쉽게 바인딩 할 수 있습니다.Visual Studio 11에서 멤버 함수를 std :: function에 직접 바인딩하는 방법은 무엇입니까?

class Class 
{ 
    Class() 
    { 
     Register([=](int n){ Function(n); }); 
    } 

    void Register(std::function<void(int)> Callback) 
    { 

    } 

    void Function(int Number) 
    { 

    } 
}; 

하지만 다음과 같이 직접 바인딩하고 싶습니다.

// ... 
Register(&Class::Function); 
// ... 

저는 C++ 11 표준에 따라 이것이 지원되어야한다고 생각합니다. 그러나 Visual Studio 11에서는 이러한 컴파일러 오류가 발생합니다. '줄 바꿈': '클래스 *'

오류 C2647에 대한 '내부'에서 변환 할 수 없습니다 '. *'할 수 없다는 '무효 역 참조 (__thiscall 클래스 :: *) (INT 오류 C2440

비 정적 멤버 함수는 implic이 있기 때문에) INT '나는 C++ 11 표준에 따라 생각

답변

17

'는에서 '이 정말

하지

을 지원해야한다 첫 번째 매개 변수는 (cv-qualified) YourType*이므로이 경우에는 void(int)과 일치하지 않습니다. std::bind에 따라서 필요 : 당신은이 같은 Class 인스턴스 호출 할 수 있음을 언급 예를

Class c; 
using namespace std::placeholders; // for _1, _2 etc. 
c.Register(std::bind(&Class::Function, &c, _1)); 

편집을 위해

Register(std::bind(&Class::Function, PointerToSomeInstanceOfClass, _1)); 

. 다음

Class c; 
c.Register(foo); 
+0

작동하지만 구문 모든 클래스 참조가 동일하다 제약 하에서 단순화 될 수 있는가? – danijar

+0

@danijar 클래스 참조가 모두 동일하다는 것은 무엇을 의미합니까? 'Class' 인스턴스에 대한 포인터를 전달해야합니다. 어느 쪽이 당신에게 달려 있습니다. – juanchopanza

+0

오른쪽. 그리고이 인스턴스는 항상 동일합니다. 이제이 정보를 염두에두고'bind (& Class :: Function, this, _1)'을 줄이고 싶습니다. 그래서, 내용 적으로,'bind'는 쓸데없는 것입니다. 거기에 기술적 인 방법을 없애거나 전달 후 함수 내에서 바인딩을 수행 할 수 있습니까? – danijar

4

당신은 std::bind 사용할 수 있습니다

void (int n) foo 
{ 
    theClassInstance.Function(n); 
} 

:이 경우, 간단한 비 멤버 함수를 사용할 수 있습니다 std::functionstd::bind으로

using namespace std::placeholders; // For _1 in the bind call 

// ... 

Register(std::bind(&Class::Function, this, _1)); 
+0

말하기,이 함수 포인터를 함수의 기본 인수로 설정하고 싶습니다. 이것이 가능한가? 나는 'bind'와 같은 호출을 사용할 수 없다. 그렇습니까? 나는'this' 포인터를 매개 변수 목록에서 찾지 못했습니다. – danijar

+1

@danijar 그것은 불가능 합니다만, 디폴트 함수에 바인드하는 인수가없는'Register'의 오버로드 된 변형을 가지고 해결할 수 있습니다. –

+0

좋은 생각, 고마워. – danijar

0

을, 당신은 다른 처리 할 수 ​​있습니다 클래스 멤버 함수는 동일합니다.

11

Stephan T. Lavavej에 따르면 - "bind(), ..., lambda를 사용하지 마십시오". https://www.youtube.com/watch?v=zt7ThwVfap0&t=32m20s

이때

:

Class() 
{ 
    Register([this](int n){ Function(n); }); 
} 
+0

이것을 지적하고 동영상의 관련 부분에 링크 해 주셔서 감사합니다! –