ฉันสามารถถือ shared_ptr โดยไม่ทราบพารามิเตอร์ type ได้หรือไม่ [ซ้ำ]

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();