2017-12-01 9 views
0

: GenericCallback([=]{});추론 람다 :: 기능 나는 기본적으로 내가 캡처 어떤 람 바어에서 일반적인 콜백 만들 수 있습니다 그것을 가지고 노력하고있어 <T>

다음 클래스를 사용하여 :

template<typename T> class GenericCallback : public Callback { 
public: 
    GenericCallback(const std::function<T>& f) { 
     mFunction = f; 
    } 

    void Call() override { 
     mFunction(); 
    } 

    std::function<T> mFunction; 
}; 

문제는 내가 템플릿 인자를 정의 할 것을 기대하고있다. 일반적으로 아무런 문제가 없지만 어떤 캡처를 사용하면 [=]을 사용하든 특정 인수를 사용하든 관계없이이 유형을이 구조로 밀어 넣을 수 없게됩니다.

내 최종 목표는 나중에 지정된 조건으로이 함수를 호출하는 것입니다.

이 오류는 경우 :

int v = 5; 
GenericCallback<void()>([=]{ int x = v; }); 
+0

* 구체적인 예 *를 제공 할 수 있습니까? 나는 아이디어를 가지고 있지만 그럴 수 있을지 확신 할 수 없다. – Incomputable

+0

@Incomputable'GenericCallback ([=] {});' –

+0

글쎄, 나는 편집 가능한 것을 원했지만, 신경 쓰지 않았다. – Incomputable

답변

1

당신은 std::function<>의 전체 개념을 잘못 이해하고 문제를 overcomplicated. 이 경우 std::function<void()>을 사용하고 꽤 일치하는 것을 바인딩 할 수 있습니다. 호출 서명을 변경해야하는 경우에만 <>으로 유형을 변경해야합니다. 따라서

class Callback { 
public: 
    using callback_type = std::function<void()>; 

    Callback(callback_type cb) : m_cb(cb) {} 
    void call() { m_cb(); } 

private: 
    callback_type m_cb; 
}; 

int main() 
{ 
    int v; 
    Callback c([=]{ int x = v; }); 
    c.call(); 
} 

간단한 작업과 템플릿이 필요하지 않습니다. 이 경우 Callback::call()에 콜백에 값을 전달하거나 반환하도록하려는 경우에만 std::function의 유형을 변경해야하며, 그렇게 할 계획이 있는지 의심 스럽습니다.

live example

+0

당신은 절대적으로 옳습니다. 이 점을 명확히 해 주셔서 감사합니다. –