2014-11-19 4 views
1

저는 std::static_pointer_cast, std::const_pointer_caststd::dynamic_pointer_caststd::shared_pointer에 대해 찾고 있습니다.itk :: SmartPointer의 포인터 캐스트?

ITK의 설명서와 itk::SmartPointer의 소스 코드를 사용해 보았으며 스마트 포인터 캐스팅에 대해 아무 것도 발견하지 못했습니다.

특별한 경우에 타사 함수에 전달하기 위해 'constness'를 포인터에 추가해야했습니다 (itk::SmartPointer<T>에서로 변환). 자동으로 생성 된 const 스마트 포인터가 범위를 벗어나면 데이터가 삭제되기 때문에 원시 포인터를 전달하는 것은 문제가되지 않습니다.

유일한 상대적으로 안전 솔루션은 내가 발견

static_cast<itk::SmartPointer<const T>>(itk_smart_pointer_of_t)합니다.

이 방법이 스레드로부터 안전한지 또는 다른 가능한 함정이 있는지는 알 수 없습니다. 또한, dynamic_cast의 경우는 더 지저분 해집니다.

ITK에는 네이티브 std::const_pointer_cast과 같은 캐스트가 없기 때문에 이상하게 보입니다.

+1

그리고 뭘 찾았습니까? 너 뭐 해봤 니? 너는 그걸로 무엇을 할거니? 그리고 그들은 ITK와 어떻게 관련이 있습니까? –

+0

@ JoachimPileborg 제 질문을 편집했습니다. – ostappus

답변

1

TL : DR : itk::SmartPointer은 포인터 캐스트가 필요하지 않으며 "원시"포인터를 캐스팅하고 대신 다시 래핑합니다.


ITK 스마트 포인터는 소유 한 개체가 참조 카운터를 제공해야 함을 의미하는 간섭 적 참조 카운트를 사용합니다.

itk::SmartPointer은 ITK 클래스에서만 사용할 수 있으며,보다 정확하게는 Register()UnRegister() 개의 클래스가있는 클래스에서만 사용할 수 있습니다. 예를 들어, itk::LightObject 클래스의 자손, 설명서에 따라

은 대부분 itk 개체의 최상위 기본 클래스입니다. 그것은 자동으로 생성 const를 스마트 포인터가 범위를 벗어나 일단 데이터가 삭제되기 때문에 원시 포인터를 전달

질문 벗어 나의 가정, 따라서 ...

를 참조 카운팅을 구현합니다.

itk::SmartPointer은 소유 된 개체의 참조 카운터를 늘리거나 줄이기 때문에 올바르지 않습니다.

스마트 포인터를 수락하는 함수에 "not-so-raw"포인터를 전달하거나 임시 스마트 포인터를 수동으로 만들고 함수에 전달하는 것이 안전하다는 것을 의미합니다.

관련 문제