>  기사  >  백엔드 개발  >  C에서 `unique_ptr`을 `unique_ptr`로 안전하게 다운캐스트하는 방법은 무엇입니까?

C에서 `unique_ptr`을 `unique_ptr`로 안전하게 다운캐스트하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-19 20:37:03695검색

How to Safely Downcast a `unique_ptr` to `unique_ptr` in C  ?

unique_ptr 다운캐스팅 to Unique_ptr

객체 지향 프로그래밍 영역에서 상속은 코드 재사용 및 확장성을 촉진하는 데 중추적인 역할을 합니다. 그러나 Unique_ptr를 "다운캐스트"해야 하는 상황이 발생할 수 있습니다. Unique_ptr

이 문제를 해결하려면 애플리케이션이 각각 고유한_ptr를 생성하는 여러 팩토리를 사용하는 가상 시나리오를 고려해 보세요. 인스턴스. 이러한 팩토리는 내부적으로 Unique_ptr, Unique_ptr 또는 Unique_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에 재할당하는 것입니다. 적절한 삭제자를 사용하세요.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.