std::is_polymorphic
Von cppreference.com
| Definiert in der Kopfdatei <type_traits> |
||
| template< class T > struct is_polymorphic; |
(seit C++11) | |
std::is_polymorphic ist ein UnaryTypeTrait.
Wenn T eine polymorphe Klasse ist (d. h. eine Nicht-Union-Klasse, die mindestens eine virtuelle Funktion deklariert oder erbt), stellt sie die Member-Konstante value gleich true bereit. Für jeden anderen Typ ist value false.
Wenn T ein unvollständiger nicht-union-Klassentyp ist, ist das Verhalten undefiniert.
Wenn das Programm Spezialisierungen für std::is_polymorphic oder std::is_polymorphic_v hinzufügt, ist das Verhalten undefiniert.
Inhalt |
[bearbeiten] Template-Parameter
| T | - | ein zu prüfender Typ |
[bearbeiten] Hilfsvariablen-Template
| template< class T > constexpr bool is_polymorphic_v = is_polymorphic<T>::value; |
(seit C++17) | |
Abgeleitet von std::integral_constant
Member-Konstanten
| value [static] |
true, wenn T ein polymorpher Klassentyp ist, andernfalls false(öffentliche statische Member-Konstante) |
Memberfunktionen
| operator bool |
konvertiert das Objekt zu bool, gibt value zurück (öffentliche Memberfunktion) |
| operator() (C++14) |
gibt value zurück (öffentliche Memberfunktion) |
Membertypen
| Typ | Definition |
value_type
|
bool |
type
|
std::integral_constant<bool, value> |
[edit] Mögliche Implementierung
namespace detail { template<class T> std::true_type detect_is_polymorphic( decltype(dynamic_cast<const volatile void*>(static_cast<T*>(nullptr))) ); template<class T> std::false_type detect_is_polymorphic(...); } // namespace detail template<class T> struct is_polymorphic : decltype(detail::detect_is_polymorphic<T>(nullptr)) {}; |
[edit] Beispiel
Führen Sie diesen Code aus
#include <type_traits> struct A { int m; }; static_assert(!std::is_polymorphic_v<A>); struct B { virtual void foo(); }; static_assert(std::is_polymorphic_v<B>); struct C : B {}; static_assert(std::is_polymorphic_v<C>); struct D { virtual ~D() = default; }; static_assert(std::is_polymorphic_v<D>); // Uses inheritance, but not the virtual keyword: struct E : A {}; static_assert(!std::is_polymorphic_v<E>); struct F : virtual A {}; static_assert(!std::is_polymorphic_v<F>); struct AX : A {}; struct AY : A {}; struct XY : virtual AX, virtual AY {}; static_assert(!std::is_polymorphic_v<XY>); int main() {}
[edit] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2015 | C++11 | Das Verhalten war undefiniert, wennT ein unvollständiger Union-Typ war |
Die Basischarakteristik ist std::false_type in diesem Fall |
[edit] Siehe auch
| (C++11) |
prüft, ob ein Typ ein Nicht-Union-Klassentyp ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein abstrakter Klassentyp ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ einen virtuellen Destruktor hat (Klassenvorlage) |