3

boost::signals2::signalboost::function 사이의 연결을 재정의해야합니다.C++ 템플릿 매개 변수 공제가 작동하지 않습니다.

template<typename T> 
void bind(boost::signals2::signal<T> &signal, boost::function<T> function) { 
    // override code ... 
} 

내가 그것을 할 수있는이 bind의 사용이 간단 만들고 싶어 : 나는 템플릿 함수 다음 만든이를 위해 . 유사한 문제의 게시물에서 읽은 것부터 템플릿 매개 변수를 함수 인수에서 추론해야합니다. 하지만 제 경우에는 명시적인 매개 변수가 없을 때 작동하지 않습니다.

boost::signals2::signal<void()> my_signal; 

bind<void()>(my_signal, boost::bind(&A::func, this)); // this works 
bind(my_signal, boost::bind(&A::func, this));   // error: no matching function for call 

내가 누락 된 것이 있습니까? 명시 적 템플릿 매개 변수를 피할 수있는 해결 방법이 있습니까?

+3

'my_signal'선언은 무엇입니까? – ildjarn

+0

@ildjarn 죄송합니다, 거기에 넣어야합니다. boost :: signals2 :: signal my_signal; – Maros

+2

변환 전에 템플릿 인수 공제가 발생합니다. 두 번째 호출에는 정확한 일치 항목이 없습니다. Boost :: bind는 두 번째 매개 변수로 변환 될 수있는 것을 제공하지만 템플릿 인수 공제 이후에만 발생할 수 있습니다. 따라서 명시 적 호출이 필요합니다. 또는 두 번째 매개 변수 전체를 템플릿으로 만들 수 있습니다. –

답변

1

두 번째 인수 형식은 std::function<T>이 아니지만 일부 바인딩 형식이므로 컴파일러에서 두 번째 함수 매개 변수에 대해 T을 추론 할 수 없습니다. 컴파일러에게 "두 번째 함수 매개 변수에 T의 형식을 찾을 수 없다"고 말할 필요가 있습니다. 이것은 두 번째 매개 변수를 추론되지 않은 컨텍스트로 만들어서 수행 할 수 있습니다.

template<typename T> 
void bind(boost::signals2::signal<T> &signal, 
      typename std::common_type<boost::function<T>>::type function) { 
    // override code ... 
} 
관련 문제