1

두 개의 가변 클래스 멤버 함수가 있습니다. 첫 번째 Init(...)이 호출 될 때 두 번째 클래스 멤버 함수에 std :: function을 만들고 다음에 Init(...)의 인수를 함수 포인터에 바인딩하려고합니다.std :: varadic 멤버 함수에 함수 다음 가변 템플릿 인수에 바인딩

은 그럼 나중에 그냥 다시 Reset(...) 모든 인수를 전달하지 않고 mf_()를 호출 할 수 있습니다

나는 그것을 템플릿 클래스를 만드는 방지하고 터플에 인수를 저장하고 싶습니다.

나는 다음과 같은 예를 들어 작업 만들려고 노력 해요 : 내가

템플릿 인수 공제 내용의 오류가 컴파일 할 때 http://cpp.sh/4ylm

예를 살 수

#include <iostream> 
#include <string> 
#include <functional> 

using namespace std; 

class Foo 
{ 
public: 
    template<typename... T> 
    void Init(T&... args) 
    { 
     cout << __func__ << endl; 
     Print(args...); 

     // bind args.. to Reset .. 
     mf_ = std::bind(&Reset, args...); 
     // mf_ = std::bind(&Foo::Reset, this, args...); ??? 
    } 

    template<typename... T> 
    void Reset(T&... args) 
    { 
     cout << __func__ << endl; 
    } 

    // std::function to Reset(...) 
    std::function<void()> mf_; 

private: 
    template<typename First> 
    void Print(First& arg) 
    { 
     cout << arg << endl; 
    } 

    template<typename First, typename... Rest> 
    void Print(First& arg, Rest&... args) 
    { 
     cout << arg << " "; 
     Print(args...); 
    } 
}; 

int main() 
{ 
    int arg1 = 1; 
    int arg2 = 2; 
    string arg3 { "test" }; 
    double arg4 = 1.10; 

    Foo foo; 
    foo.Init(arg1, arg2, arg3, arg4); 

    //foo.mf_(); 
    return 0; 
} 

링크/대체 실패 : 17:37 :
참고 : 템플릿 매개 변수 '_ 결과'를 추론 할 수 없습니다.

+0

질문에 대한 해결책을 편집하지 마십시오. – Barry

답변

1

문제는 &Reset은 (는) 유효한 멤버 포인터 표현식이 아닙니다.

당신은 포인터 - 투 - 회원 기능을 형성 &Foo::Reset 말을해야하고, 당신은 또한 this 포인터를 제공해야합니다, 그래서 당신은 거의 정확한 위치 :

// mf_ = std::bind(&Foo::Reset, this, args...); ??? 

그러나 때문에 여전히 유효 아니다 Reset은 기능 템플릿이므로 템플릿의 특수화를 말해야합니다.

당신은 명시 적 템플릿 인수 목록을 제공하여 원하는 전문화 컴파일러 말할 수

:

mf_ = std::bind(&Foo::Reset<T&...>, this, args...); 

또는 컴파일러가 추론 할 수 있습니다 &Foo::Reset에서 초기화 올바른 유형의 변수를, 만들어를하는 전문화 당신은 의미 :

또는 권리 유형에 대한 형식 정의를 생성하고 해당 유형에 &Foo::Reset을 캐스팅하여

void (Foo::*f)(T&...) = &Foo::Reset; 
mf_ = std::bind(f, this, args...); 
:

using pmf_type = void (Foo::*)(T&...); 
    mf_ = std::bind((pmf_type)&Foo::Reset, this, args...); 
+0

감사! 그것은 효과가있다. 내 원래 질문을 라이브 솔루션 데모로 업데이트했습니다. – Ody