2012-04-13 4 views
2

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?

+2

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

Antwort

4

es funktioniert nicht, weil Sie übereinstimmen shared_ptr nicht B. Sie müssen abgeleitet von shared_ptr übereinstimmen.

template<typename T, class = void> 
struct ExtractBaseType; 

template<class C> 
struct ExtractBaseType< 
    C, typename enable_if< 
      boost::is_base_of<shared_ptr<typename T::element_type>, T>::value 
     >::type 
    > 
{ 
    typedef typename T::element_type type; 
}; 

^nicht getestet, aber die Grundidee ist es

Gute Frage. Das heißt, erben von shared_ptr scheint hässlich.

Verwandte Themen