unique_ptr
객체 지향 프로그래밍 영역에서 상속은 코드 재사용 및 확장성을 촉진하는 데 중추적인 역할을 합니다. 그러나 Unique_ptr
이 문제를 해결하려면 애플리케이션이 각각 고유한_ptr
unique_ptr<Base> DerivedAFactory() { return unique_ptr<Base>(new DerivedA); }
목표는 반환된 고유_ptr
unique_ptr<Derived> ptr = static_cast<unique_ptr<Derived>>(DerivedAFactory());
그러나 이 접근 방식에는 잠재적인 위험이 있습니다. 보다 강력한 솔루션은 Unique_ptr
unique_ptr<Derived> CastToDerived(Base* obj) { return unique_ptr<Derived>(static_cast<Derived*>(obj)); }
이 캐스팅 프로세스는 개체가 DLL에서 동적으로 로드되고 동일한 컨텍스트에서 해제되는 한 유효해야 합니다. 그러나 여러 컨텍스트에 걸쳐 소유권을 이전하는 경우 포인터와 함께 올바른 삭제자를 제공하도록 주의해야 합니다.
추가된 안전성과 유연성을 위해 캐스팅에 함수 템플릿을 활용하는 것이 좋습니다.
template<typename Derived, typename Base, typename Del> std::unique_ptr<Derived, Del> static_unique_ptr_cast( std::unique_ptr<Base, Del>&& p ) { auto d = static_cast<Derived *>(p.release()); return std::unique_ptr<Derived, Del>(d, std::move(p.get_deleter())); } template<typename Derived, typename Base, typename Del> std::unique_ptr<Derived, Del> dynamic_unique_ptr_cast( std::unique_ptr<Base, Del>&& p ) { if(Derived *result = dynamic_cast<Derived *>(p.get())) { p.release(); return std::unique_ptr<Derived, Del>(result, std::move(p.get_deleter())); } return std::unique_ptr<Derived, Del>(nullptr, p.get_deleter()); }
이러한 템플릿은 정적 및 동적 캐스팅 옵션을 모두 제공하면서 전달된 고유_ptr이 호출자로부터 실수로 도난당하지 않도록 보장합니다. 포인터가 동적 캐스팅 없이 Derived *로 알려진 경우 정적 버전을 사용할 수 있으며, 동적 버전은 Dynamic_cast를 사용하여 런타임 검사를 수행합니다.
위 내용은 C에서 `unique_ptr`을 `unique_ptr`로 안전하게 다운캐스트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!