2016-09-15 2 views
2

나는 각각의 클래스 객체로 바인딩 함수 포인터의 번호를 가지고 각각의 'std :: function'과 관련된 특정 클래스.바인딩 해제 표준 : 바인드 ++

auto Unbind(std::function<void()> &Example)->void 
{ 
    //Find which object &Example is bound with (in this case EO/ExampleClass) 
} 

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+3

이것은 불가능합니다. 'std :: function'의 타겟을 검색 할 수는 있지만, 타겟 타입은 알 수없는 타입의 바인드 표현식입니다. 여러분은 이후 정보를 검색 할 인터페이스가 없습니다. –

+0

@KerrekSB 대답 : – Quentin

+0

@KerrekSB 예를 들어 std :: function :: target을 사용할 수 있습니까? –

답변

4

std::function은 유형 삭제를 수행합니다. 이름에 따라 인터페이스에서 실제 기본 유형을 지 웁니다.

돌아 오는 길은 없습니다. 대상 객체의 유형을 유지하려면

, 다음 std::mem_fn 당신이 원하는 수 있습니다 : 당신은 function 객체와 함께 할 수 없습니다

http://en.cppreference.com/w/cpp/utility/functional/mem_fn

+0

'target'은 유형 삭제에서 "뒤로 돌아 오는 길"을 제공합니다. 문제는'std :: bind'입니다. –

+0

@KerrekSB target_type은 유형이 아닌'std :: type_info'입니다. 따라서 미리 계산 된 알려진 유형의 목록과 비교하는 데 사용할 수있는 유일한 방법이 있습니다. 나는 그것이 의미하는 의미에서 (즉, 연역적) "길을 뒤로"자격이 있다고 생각하지 않습니다. 나는 그것이 "돌아 오는 길의 한 단계"라고 생각할 것이다. :) –

+1

글쎄, 네가 예상하는 타입을 알아야하지만, 분명히하기 위해'target' (not target_type')은 실제 포인터를 실제 객체 (또는 null). –

1

.

가능성은 메서드와 개체에 대한 참조를 저장하는 래퍼를 구성하는 것입니다. 이 같은

뭔가 :

template<typename T, typename Fn> 
struct MemberFunctionPointer { 
    MemberFunctionPointer(T* ref, Fn fn) : m_ref(ref), 
              m_method(fn) { } 

    template<typename... Args> 
    auto operator()(Args&&... args) { 
    return (m_ref->*m_method)(std::forward<Args...>(args)...); 
    } 

    T* m_ref = nullptr; // a reference (pointer) to the object instance 
    Fn m_method = nullptr; // a reference to the function method 
}; 

참고 :이 그냥 처음이다. 보다 정교한 인터페이스를 추가해야합니다. 게다가 MemberFunctionPointer 객체를 생성하기위한 도우미 함수도 유용 할 수 있습니다.

단순히 function 대신 해당 종류의 개체를 전달할 수 있습니다.

struct Foo { 
    void bar() { 
    // something 
    } 
}; 

int main(int argc, char *argv[]) { 
    Foo f; 
    MemberFunctionPointer<Foo, decltype(&Foo::bar)> method(&f, &Foo::bar); 

    method(); // call the method on the object f. 

    assert(&f == method.get_obj_reference()); 
    return 0; 
} 
관련 문제