Posso tenere un shared_ptr senza conoscere il parametro type? [duplicare]

Aug 17 2020

Vorrei tenere una shared_ptrclasse di un modello. Tuttavia, non voglio creare la classe B anche come classe modello. A quanto mi risulta, shared_ptr con qualsiasi tipo avrà lo stesso layout di memoria. Quindi mi chiedo qualche soluzione alternativa in questo scenario?

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

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

Risposte

2 AtnNn Aug 17 2020 at 17:19

Quando il tipo non ha importanza, voidpuò essere utilizzato.

template <typename>
class C {};

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

L'aggiunta di una classe base monomorfica consente di limitare il tipo che può essere memorizzato.

class AnyC {};

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

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

Se quella classe base ha metodi virtuali, possono essere chiamati tramite il puntatore.

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