C++ - 자주 사용하는 C++ 이디엄(idiom) Coercion by Member Template
클래스 B가 A에서 파생되어 B 타입 객체에 대한 포인터는 A 타입의 포인터에 대입할 수 있지만 이들 타입의 복합 타입은 바탕이 된 타입의 관계를 공유하지 않는다.
예를 들면 template_class는 template_class에 대입할 수는 없다.
class A{};
struct B:A{};
template<class T>
class template_class{};
A* aptr;
B* bptr;
aptr=bptr;
template_class<A> tca;
template_class<B> tcb;
tca=tcb; // ill-formed
그러나 이를 허용함으로써 스마트 포인터와 같은 래퍼 클래스에서의 취급에서 유용하게 될 때가 있다. 이것을 실현하는 것이 Coercion by Member Template idiom 이다.
class A{};
struct B:A{};
template<class T>
struct ptr_wrapper{
ptr_wrapper():ptr(nullptr){}
// ...
template<class U>
ptr_wrapper(const ptr_wrapper<U>& p):ptr(p.ptr){}
template<class U>
ptr_wrapper& operator=(const ptr_wrapper<U>& p)
{
ptr=p.ptr;
return *this;
}
T* ptr;
};
이 글은 2020-06-01에 작성되었습니다.