Bisakah saya memegang shared_ptr tanpa mengetahui parameter type? [duplikat]

Aug 17 2020

Saya ingin mengadakan shared_ptrkelas template. Namun, saya tidak ingin menjadikan kelas B sebagai kelas template juga. Dalam pemahaman saya, shared_ptr dengan tipe apapun akan memiliki tata letak memori yang sama. Jadi saya ingin tahu solusi apa pun dalam skenario ini?

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

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

Jawaban

2 AtnNn Aug 17 2020 at 17:19

Bila jenisnya tidak masalah sama sekali, voidbisa digunakan.

template <typename>
class C {};

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

Menambahkan kelas dasar monomorfik memungkinkan pembatasan jenis yang dapat disimpan.

class AnyC {};

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

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

Jika kelas dasar tersebut memiliki metode virtual, mereka dapat dipanggil melalui penunjuk.

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