type 매개 변수를 몰라도 shared_ptr을 보유 할 수 있습니까? [복제]

Aug 17 2020

shared_ptr템플릿 클래스 를 개최하고 싶습니다 . 그러나 클래스 B도 템플릿 클래스로 만들고 싶지 않습니다. 내 이해에 따르면 모든 유형의 shared_ptr은 동일한 메모리 레이아웃을 갖습니다. 이 시나리오에서 해결 방법이 궁금합니다.

template<T>
class A {
...
};

class B {
...
  std::shared_ptr<A<T>> ptr;
}

답변

2 AtnNn Aug 17 2020 at 17:19

유형이 전혀 중요하지 않을 때 void사용할 수 있습니다.

template <typename>
class C {};

std::shared_ptr<void> p = std::make_shared<C<int>>();

모노 모픽 기본 클래스를 추가하면 저장할 수있는 유형을 제한 할 수 있습니다.

class AnyC {};

template <typename>
class C : public AnyC {};

std::shared_ptr<AnyC> p = std::make_shared<C<int>>();

해당 기본 클래스에 가상 메서드가 있으면 포인터를 통해 호출 할 수 있습니다.

class AnyC {
    virtual void f();
};

template <typename>
class C : public AnyC {
    void f() override;
};

std::shared_ptr<AnyC> p = std::make_shared<C<int>>();
p->f();