Puis-je contenir un shared_ptr sans connaître le paramètre de type? [dupliquer]

Aug 17 2020

Je voudrais tenir une shared_ptrclasse de modèle. Cependant, je ne veux pas faire de la classe B une classe modèle aussi. Dans ma compréhension, shared_ptr avec n'importe quel type aura la même disposition de mémoire. Donc je me demande une solution de contournement dans ce scénario?

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

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

Réponses

2 AtnNn Aug 17 2020 at 17:19

Lorsque le type n'a pas d'importance du tout, voidpeut être utilisé.

template <typename>
class C {};

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

L'ajout d'une classe de base monomorphe permet de restreindre le type qui peut être stocké.

class AnyC {};

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

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

Si cette classe de base a des méthodes virtuelles, elles peuvent être appelées via le pointeur.

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