2017-02-13 2 views
1

청취자/콜백 클래스를 코딩하려고 시도하지만 콜 메소드에서 I get Declaration type contains unexpanded parameter pack 'Args'입니다. 나는대로 전화를 걸 : 내가 인수의 다른 수 많은 호출 방법을 만들 수 있습니다 listeners.call (&ListenerType::myCallbackMethod, arg1, arg2, etc);선언 유형에 확장되지 않은 매개 변수 팩 'Args'가 포함되어 있습니다.

좋아,하지만 난 단지 할 수 있다면 하나의 방법은

template <typename ...Args> 
void call (void (ListenerClass::*callbackFunction) (Args), Args && ...value) // Compiler error: Declaration type contains unexpanded parameter pack 'Args' 
{ 
    auto iter = listeners.begin(); 
    while (iter != listeners.end()) 
    { 
     if(auto p = iter->lock()) 
     { 
      (p->*callbackFunction) (std::forward<Args>(value)...); 
      ++iter; 
     } 
     else 
      iter = listeners.erase(iter); 
    } 
}; 

어떤 제안이 더 좋다? 감사합니다.

+2

오류 메시지에 모두 나와 있습니다. 'Args'라는 확장되지 않은 매개 변수 팩을 가진 선언은 어디에 있습니까? 그것을 확장하십시오. – Barry

+0

수평 스크롤 막대를 피하기 위해 다시 형식을 지정하려고 시도했지만 인수의 이름이 변경되었으므로 정답이 무효화됩니다. 나는 뒤로 물러났다. –

+0

제쳐두고, 당신의 디자인은 몹시 나쁜 생각입니다. 전달 참조가 그렇게 작동하지 않습니다. – Yakk

답변

4

나는 문제가 여기에 있다고 생각 :

template <typename ...Args> 
void call (void (ListenerClass::*callbackFunction) /*here->*/(Args), Args && ...value) 

이 있어야한다 : 당신은 함수 포인터 당신이 매개 변수 유형을 Args의 테이크 매개 변수로 전달되는 것을 지정하는

template <typename ...Args> 
void call (void (ListenerClass::*callbackFunction) (Args...), Args && ...value) 

팩. 따라서 해당 매개 변수 팩을 확장해야합니다. ...

+0

그 경우에'std :: forward '호출에서'Args'가 반드시 확장되어야합니까? – Cameron

+0

'std :: forward (value) ...'이미 확장되어 있으므로 다음을 참고하십시오 : http://stackoverflow.com/a/41071580/1865694 http://stackoverflow.com/q/41071181/1865694 –

+0

Ah , 고마워 ,-) – Cameron

관련 문제