2011-10-10 3 views
5

std :: bind를 사용하여 boost :: signals2 :: signal :: connect() 멤버 함수를 전달하는 것이 안전합니까? 다른 말로하면, boost :: bind와 std :: bind는 상호 교환 가능합니까?std :: bind를 boost :: signals2와 함께 사용하는 것이 안전합니까?

이 코드는 VC++ 2010 SP1로 컴파일되지만 템플릿 코드는 내 머리 위로 지나치게 정의되지 않은 동작 영역으로 모험 할 수 있습니다.

답변

1

connect 기능은 기본적으로 대해 정의 operator()있다 아무것도 주변의 일반적인 래퍼 인 boost::function 개체를합니다. 그러므로 그것은 당신이 구속력을 갖는 것만 큼 안전합니다.

는 예를 들어,이 비교적 안전하다 :이 데이터의 일부로서 저장 boost::shared_ptr 때문에

boost::shared_ptr<ClassName> pValue = boost::make_shared<ClassName>(...); 
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...); 

이 비교적 안전하다.

ClassName *pValue = new ClassName(...); 
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...); 

조건부 안전합니다. 연결이 여전히 존재하고 delete pValue을 실행하면 즉시 안전하지 않게됩니다.

저는 개인적으로 "조건부 안전"에 대한 믿음을 많이 가지지 않지만 그게 당신에게 달렸습니다. 당신이 바인딩하는 모든 것이 boost::bind에 바인딩되어있는 한 계속 존재해야한다는 것입니다.

2

필자는이 주제에 익숙하지 않았기 때문에 connect에서 유효한 함수 호출 연산자를 구현하는 모든 것을 취할 것으로 기대합니다. boost :: bind, std :: bind 또는 다른 어떤 것든지 서명과 일치하는 함수 나 함수 객체로 호출하는 것이 안전해야합니다. Boost 라이브러리는 일반적으로 설계 되었기 때문에 일반적으로 서로의 구현 세부 사항을 선택하지 않습니다.

관련 문제