¿Puedo mantener un shared_ptr sin conocer el parámetro de tipo? [duplicar]

Aug 17 2020

Me gustaría tener una shared_ptrclase de plantilla. Sin embargo, no quiero que la clase B también sea una clase de plantilla. Según tengo entendido, shared_ptr con cualquier tipo tendrá el mismo diseño de memoria. Entonces, me pregunto alguna solución en este escenario.

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

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

Respuestas

2 AtnNn Aug 17 2020 at 17:19

Cuando el tipo no importa en absoluto, voidse puede usar.

template <typename>
class C {};

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

Agregar una clase base monomórfica permite restringir el tipo que se puede almacenar.

class AnyC {};

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

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

Si esa clase base tiene métodos virtuales, se pueden llamar a través del puntero.

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