2013-08-17 3 views
3

f 함수에 대한 참조를 바인딩하려면 std::bind(f, std::ref(x))을 사용할 수 있습니다. 이 경우 f은 참조를 받거나 사본을 만듭니다.std :: shared_ptrs에 대한 std :: reference_wrapper의 병렬 처리

이제는 기능이 void g(T & t)입니다. 입력 인수를 std::shared_ptr<T> mySharedPtr (예 : std::bind(g, mySharedPtr))에 바인딩하고 싶습니다. 이렇게하면 mySharedPtr의 데이터가 최소한 바인드만큼의 수명을 갖게됩니다. 그러나 g이 참조를 취하고 있기 때문에 유형 확인을하지 않습니다.

std::ref과 비슷한 항목이 std::shared_ptr이며 g에 전달하기 전에 역 참조합니까? 그렇지 않다면 내가 직접 만들 수 있을까요?

은 (는 람다를 사용하여 대답을하면 내 컴파일러를 지원하지 않기 때문에, 또한 람다없이 하나를 포함하시기 바랍니다.)

편집 : 그것은 std::shared_ptr의 수명 보증을 상실하기 때문에 std::bind(g, std::ref(*mySharedPtr))이 작동하지 않습니다.

+0

C++ 11? 'g' 포장은 괜찮습니까? – Yakk

+0

람다를 사용하면'g'를 감쌀 것입니다. 불행히도 나는 그렇게하지 않는다. 그래서 바인딩하기 전에 각'g'와 같은 함수를 수동으로 포장해야 할 것이다. –

답변

2

당신이 전환시 포인터처럼 보이는 뭔가를 역 참조 객체를 만들 것 deref() 함수를 만들 수있는 것 같다

template <typename P> 
class pointer_wrapper { 
    P ptr; 
public: 
    pointer_wrapper(P p): ptr(p) {} 
    operator decltype(*std::declval<P>())&() { 
     return *ptr; 
    } 
}; 
template <typename P> 
pointer_wrapper<P> deref(P p) { 
    return p; 
} 

몇 가지 더 많은 전환을 허용하도록 전환이 멤버 템플릿을 만들기 위해 더 좋을 수 있습니다 .

관련 문제