2017-03-21 1 views
4

shared_ptr<char>shared_ptr<unsigned char>으로 변환하는 좋은 방법이 있습니까?표준을 변환 :: shared_ptr <char> std :: shared_ptr <부호없는 문자>

나는 다음을 생각해 냈지만 매우 깨끗해 보이지 않았다.

int main(int argc, char** argv) 
{ 
    std::shared_ptr<char> p1 = std::make_shared<char>(); 

    std::shared_ptr<unsigned char> p2 = std::shared_ptr<unsigned char>(
     reinterpret_cast<unsigned char*>(p1.get()), 
     [p1](unsigned char*) {}); 
} 
+0

원래 나는 람다 캡쳐를 이해하지 못했고 버그가 있다고 생각했지만, 생각해 본 결과 나는 없을 것이라고 생각합니다. 사실, 이것은 'reinterpret_pointer_cast'보다 더 복잡하고 보편적 인 해결책으로 보입니다. 사실,'reinterpret_pointer_cast'는 나쁜 생각처럼 보입니다. 그것은 한 수준의 재 해석만을 제거합니다. 여러 레벨의 포인터 (예 :''*** char')가 있다면, 더 세분화 된 트릭이 필요할 상황을 만듭니다. 반면에 람다 캡처는 그러한 시나리오에서보다 균일하게 적용될 수 있습니다. – grovkin

답변

6

reinterpret_pointer_cast, 당신이 무슨 일을하는지에 대한 준비가 만든 기능이 있습니다 :

std::shared_ptr<unsigned char> p2 = 
    std::reinterpret_pointer_cast<unsigned char>(p1); 

원래의 포인터 결과 포인터를 공유 소유권.

대조적으로, 자신의 코드는 두 개의 별도의 소유권 그룹으로 끝납니다. 원래 그룹이 먼저 죽으면 새 포인터가 매달려있을 것입니다!

p1.get()을 사용하고 별칭 생성자를 사용하면 원래 포인터와 소유권을 공유 할 수 있습니다. 즉 그 캐스트 헬퍼 (링크 참조)를 구현하는 방법 사실이다 :

std::shared_ptr<unsigned char> p2(p1, reinterpret_cast<unsigned char*>(p1.get())); 

이 두 번째 생성자 인자로 주어진 값을 p1와 소유권을 공유하지만, 저장하는 공유 포인터를 만듭니다.

+0

'reinterpret_pointer_cast'에 대한 구현이 있습니까? 나는 컴파일러에서 이것을 찾을 수 없었다. – tcb

+0

대답이 무엇을 말하지 않는 : ** 당신이 이것을 해야하는 경우, 뭔가 잘못되었을 가능성이 있습니다 **. –

+0

@tcb : 링크를 클릭하기 만하면됩니다. C++ 11 기능이라는 것을 알게 될 것입니다. 이제 컴파일러가 제공하는 C++ 11 기능 중 하나인지 여부를 확인할 수 있습니다. 어떤 사람들은 "컴파일러가 C++ 11의 모든 기능을 가지고 있지 않다면 어떤 종류의 중세 크레타 인"이라고 말할 것입니다. 우리가 실제로 C++을 실제 세상에서 사용하는 사람들은 흔히 배타적 인 C++ 11에 머물기 만하면 취미 인 농담이 아닙니다. 우리는 운이 좋았습니다. 그래서 당신의 등을 맞습니다.) –

관련 문제