Posso manter um shared_ptr sem saber o parâmetro de tipo? [duplicado]

Aug 17 2020

Eu gostaria de realizar uma shared_ptraula de modelo. No entanto, não quero tornar a classe B uma classe de modelo também. No meu entendimento, shared_ptr com qualquer tipo terá o mesmo layout de memória. Então, estou querendo saber alguma solução alternativa neste cenário?

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

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

Respostas

2 AtnNn Aug 17 2020 at 17:19

Quando o tipo não importa, voidpode ser usado.

template <typename>
class C {};

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

Adicionar uma classe base monomórfica permite restringir o tipo que pode ser armazenado.

class AnyC {};

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

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

Se essa classe base tiver métodos virtuais, eles podem ser chamados por meio do ponteiro.

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