- 템플릿 인자를 변환 시킬때 사용하는 기법
- Dog와 Animal이 상속 관계에 있을때, 즉, 변환이 가능할때.
- unique_ptr<T(Dog)>는 unique_ptr(U(Animal)>로 암시적 변환이 가능해야 한다.
- 템플릿 버전의 move 생성자를 제공해야 한다.
- 필요한 함수나 생성자들에 전부 변환용 템플릿을 따로 추가해 주는것.
template<class T> class SmartPtr
{
T* ptr = nullptr;
public:
SmartPtr() = default;
SmartPtr(T* p) : ptr(p) {}
// template 생성자.
template<class U,
class = std::enable_if_t<std::isconvertible_v<U*, T*>>> // 변환이 가능할때만 사용.
SmartPtr(const SmartPtr<U>& sp) : ptr(sp.ptr) {}
// 다른 타입의(Dog, Animal) private에 접근하는것을 허용하기 위해 등록.
// SmartPtr이 템플릿이고, 그것이 friend라는것을 써준것.
template<class> friend class SmartPtr;
};
int main()
{
SmartPtr<Dog> sp1(new Dog);
SmartPtr<Animal> sp2 = sp1;
}