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>'
.
Gib 'ptr' ein sfinae'ed Konstruktor von 'ptr ' beschränkt auf 'is_base_of'? –