unique_ptr을 기본에서 파생으로 다운캐스트하는 방법
객체 지향 프로그래밍에서는 클래스 계층을 사용하여 실제 세계 개념. C에서는 종종 상속을 사용하여 이를 수행합니다. 상속을 통해 파생 클래스는 기본 클래스의 속성과 동작을 상속받을 수 있습니다.
클래스 계층 구조를 사용할 때 일반적으로 필요한 것 중 하나는 기본 클래스에 대한 포인터를 파생 클래스에 대한 포인터로 변환하는 것입니다. 이 프로세스를 다운캐스팅이라고 합니다.
고유 포인터의 맥락에서 다운캐스팅은 약간 까다로울 수 있습니다. 이는 고유 포인터가 매달린 포인터 및 기타 메모리 문제를 방지하도록 설계되었기 때문입니다. 따라서 단순히 static_cast를 사용하여 Unique_ptr을 다른 유형으로 변환할 수는 없습니다.
대신 다음 방법 중 하나를 사용해야 합니다.
1. 정적 고유 포인터 캐스트
이 방법은 고유 포인터에 실제로 파생 클래스에 대한 포인터가 포함되어 있다고 확신할 때 사용할 수 있습니다. 다음 함수 템플릿을 사용하여 정적 고유 포인터 캐스트를 수행할 수 있습니다.
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())); }
2. 동적 고유 포인터 캐스트
이 방법은 고유 포인터에 파생 클래스에 대한 포인터가 포함되어 있는지 확실하지 않을 때 사용할 수 있습니다. 다음 함수 템플릿을 사용하여 동적 고유 포인터 캐스팅을 수행할 수 있습니다.
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()); }
예
다음 코드는 정적 고유 포인터 캐스팅을 사용하는 방법을 보여줍니다. Unique_ptr을 다른 유형으로 변환:
#include <memory> class Base { public: virtual ~Base() {} }; class Derived : public Base { public: ~Derived() {} }; int main() { std::unique_ptr<Base> uptr = std::make_unique<Derived>(); std::unique_ptr<Derived> dptr = static_unique_ptr_cast<Derived>(std::move(uptr)); return 0; }
이 예에서는 Unique_ptr을 Base로 생성합니다. 물체. 그런 다음 정적 고유 포인터 캐스트를 사용하여 고유_ptr을 고유_ptr, 파생 개체로 변환합니다. 이는 기본 개체에 대한 고유_ptr에 실제로 파생 개체에 대한 포인터가 포함되어 있다는 것을 알고 있기 때문에 가능합니다.
위 내용은 C에서 'unique_ptr'을 Base에서 Derived로 안전하게 다운캐스트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!