Ich versuche, eine Vorlage zu schreiben, die den Basistyp eines boost :: shared_ptr extrahiert.Vorlage, die einen abgeleiteten Typ von seiner Basis entspricht
Ich schrieb diese Vorlage:
template<typename T>
struct ExtractBaseType;
template<typename T>
struct ExtractBaseType<boost::shared_ptr<T> >
{
typedef T type;
};
es funktioniert für eine reine shared_ptr in Ordnung. Dies ist:
struct A
{
};
ExtractBaseType<boost::shared_ptr<A> >::type a_thing;
std::cout << typeid(a_thing).name() << std::endl;
druckt "1A".
Dies ist jedoch nicht kompiliert:
struct B : boost::shared_ptr<A>
{
};
ExtractBaseType<B>::type b_thing;
Der Compiler beschwert sich, dass ExtractBaseType nicht definiert ist.
Warum so? Und wie würde das gemacht werden?
shared_ptr ist nicht als Basisklasse konzipiert und oft wird shared_ptr nach Wert übernommen. Dies hat wahrscheinlich ein unerwartetes Verhalten, abhängig von Ihrer abgeleiteten Klasse. shared_ptr sollte wahrscheinlich eine 'final' Klasse sein, oder zumindest sollten Sie sie so behandeln, als ob sie es wäre. – bames53