2016-05-14 3 views
1

Ich versuche, eine Smart Pointer-Klasse für Bildungszwecke zu implementieren. Wenn Klasse U eine Basis der Klasse T ist, möchte ich Folgendes tun können.Impliziter Cast für die Implementierung von Smart Pointern

Ich struggeling diese implizite Besetzung zu implementieren, also könnte mir jemand dabei helfen?

+2

Gib 'ptr ' ein sfinae'ed Konstruktor von 'ptr ' beschränkt auf 'is_base_of'? –

Antwort

2

Hier ist ein Beispiel für die Verwendung von std::is_base_of, um dies zu erreichen.

In example.h:

#include <type_traits> 

template <typename T> 
class Example { 
public: 
    template < 
    typename T2, 
    typename = typename std::enable_if<std::is_base_of<T, T2>::value>::type 
    > 
    Example (const Example<T2> &) {} 

    Example() = default; 
}; 

Wie erwartet, stellt das folgende Programm erfolgreich:

#include <example.h> 

class Foo {}; 
class Bar : public Foo {}; 

int main (int argc, char * argv []) { 
    Example<Bar> bar; 
    Example<Foo> foo = bar; 
} 

Klasse Bar von Klasse abgeleitet ist Foo, so kann ein Example<Foo> von einem Example<Bar> initialisiert werden.

auch wie erwartet, das folgende Programm zu kompilieren, schlägt fehl:

#include <example.h> 

class Foo {}; 
class Baz {}; 

int main (int argc, char * argv []) { 
    Example<Baz> baz; 
    Example<Foo> foo = baz; 
} 

Klasse Baz Klasse Foo, ohne Beziehung ist so ein Example<Foo> kann nicht von einem Example<Baz> initialisiert werden. Clang stellt die folgende Fehlermeldung bereit: error: no viable conversion from 'Example<Baz>' to 'Example<Foo>'.