2012-08-10 3 views
12

가변 개수의 매개 변수가있는 멤버 함수가 std::function에 저장되어 있으며이 인스턴스를 바인딩하고 독립 함수 개체를 가져옵니다.바인딩 멤버가 가변적 인 방식으로 작동합니다.

template <class T, class R, class... Args> 
void connect(const T& t, std::function<R(const T&, Args...)> f) { 
    std::function<R(Args...)> = /* bind the instance c into the function? */ 
} 

// ... 

Class c; 
connect(c, &Class::foo); 

인수 고정 된 수의 내가 std::bind 사용하는 거라고,하지만 난 가변 매개 변수에 대해이 작업을 수행하는 방법을 볼 수 없습니다하십시오. 이미 인수 금액과 모든 것을 갖고 있기 때문에

+0

정확히 어떻게 당신이 인수'합니까를 ...'? – Xeo

+0

좋아요, 나는 코드를 다르게 썼습니다. 잘하면이 방법으로 이해할 수 있습니다. –

+0

예, 그렇습니다. 그리고 솔루션을 쉽게 만듭니다. :) – Xeo

답변

15

이 솔루션은 매우 간단하다 :

template <class T, class R, class... Args> 
void connect(const T& t, std::function<R(const T&, Args...)> f) { 
    // or capture 't' by-value 
    std::function<R(Args...)> fun = [&t,f](Args... args){ f(t,args...); }; 
    // ... 
} 

Live example.

+0

이것은 호출 스택에 추가 레이어를 추가합니다. 즉, 부작용이 없도록 몇 가지'std :: forward' 마법을 추가해야합니다. 맞습니까? –

+4

@lucas : 영리한 완전 전달 마법조차도 마술처럼'std :: function'을 통한 호출이 사라지지 않을 것입니다. ;) – Xeo

+0

: P하지만 필요한 것 이상을 복사해서는 안됩니다. –

관련 문제