Puis-je contenir un shared_ptr sans connaître le paramètre de type? [dupliquer]
Je voudrais tenir une shared_ptr
classe 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
Lorsque le type n'a pas d'importance du tout, void
peut ê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();